2015-04-03 25 views
-2

我定义这个类:防止对象物进行浇铸任何但是一种类型的C++

template <class T> 
class pure 
{ 
public: 
    pure(T const& attr) { 
     this->attr = attr; 
    } 

    ~pure() {} 

    T& operator=(T const& attr) { 
     return attr; 
    } 

    operator T() { 
     return this->attr; 
    } 

private: 
    T attr; 
}; 

这是存储T类型的值的类。当我想使用它的实例时,我得到attr(通过将pure转换为T)而不是实例(pure)本身。

我的目标是制作一个不能铸造成除attr,即T类型以外的任何类型的课程。

+0

如果你的对象没有从“纯”转换为“T”,那么不要为它提供一个转换操作符。 – thecoshman 2015-04-03 12:15:21

+0

不,我想我的纯粹不能被铸造成任何类型**除T ** – 2015-04-03 12:18:43

+1

为什么这是一个坏问题? – 2015-04-03 12:27:53

回答

7

如果你有一个支持C++ 11的编译器,你可以添加例如以下成员函数:

template<typename U> 
operator U() = delete; 

该函数是一个通用的铸造操作符,并标记为已删除(这是C++ 11中的新功能)。由于它被标记为已删除,因此投射到除T之外的任何其他类型都将导致编译器错误。


如果没有有一个C++ 11能够编译器,那么你基本上可以添加相同的函数声明为private功能,你会得到另一个错误:

private: 
    template<typename U> 
    operator U(); 
+0

谢谢!你很棒 !我会尝试。 – 2015-04-03 12:19:28

+0

我有C++ 11,你的方法工作得很好,再次感谢!我会将你的帖子标记为答案!很好很简单,我喜欢这个删除关键字。 – 2015-04-03 12:22:35