我有一个模板类,可以(有时必须)采用const
类型,但是有一个方法可以返回具有相同类型的类的新实例,但应该显式为非const 。例如,以下代码无法编译
template<class T> class SomeClass {
public:
T val;
SomeClass(T val) : val(val) {}
SomeClass<T> other() {
return SomeClass<T>(val);
}
};
int main() {
SomeClass<const int> x(5);
SomeClass<int> y = x.other();
return 0;
}
因为即使在构造函数中有val的副本,它也会复制到相同的类型 - const int
。就像您可以在模板中区分T
和const T
一样,有没有办法区分T
和“nonconst T
”?
答案 0 :(得分:4)
SomeClass<typename std::remove_const<T>::type> other()
{
return SomeClass<typename std::remove_const<T>::type>(val);
}
std::remove_const
来自<type_traits>
,是C ++ 11。 Boost.TypeTraits中可能有boost::remove_const
,您甚至可以自己滚动。{1}}。也可以使用std::remove_cv
。
答案 1 :(得分:4)
如果您使用的是c ++ 11,则可以使用std::remove_const
。否则,您可以使用:
struct <typename T>
struct remove_const
{
typedef T type;
};
struct <typename T>
struct remove_const<const T>
{
typedef T type;
};
其中也是如此。
答案 2 :(得分:0)
问题本质上是有两种不同的类型,它们不是严格可转换的。
您可以在type_traits中使用/ return std::remove_const
:
#include <type_traits>
template<class T>
class SomeClass {
public:
T val;
SomeClass(T p) : val(p) {
}
SomeClass<typename std::remove_const<T>::type> other() {
return static_cast<SomeClass<typename std::remove_const<T>::type> >(val);
}
};
int main() {
SomeClass<const int>x(5);
SomeClass<int>y = x.other();
return 0;
}