正在获取模板中的非常量类型

Getting non-const type in template

本文关键字:非常 常量 类型 获取      更新时间:2023-10-16

我有一个模板类,它可以(有时也必须)采用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。就像你可以在模板中区分Tconst T一样,有没有办法区分T和"nonconst T"?

SomeClass<typename std::remove_const<T>::type> other()
{
    return SomeClass<typename std::remove_const<T>::type>(val);
}

CCD_ 7来自CCD_。Boost.TypeTraits中可能有一个boost::remove_const,或者你甚至可以自己滚动。也可以使用std::remove_cv

如果使用的是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;
};

这也是一样的。

本质上的问题是,有两种不同的类型不能严格转换。

您可以从type_traits:使用/返回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;
}