将class <t>转换为class <const t =“”>`转换运算符的惯用方式

时间:2019-04-12 16:45:05

标签: c++ type-conversion operator-overloading idioms

假设有一个模板类template <class T> myclass;

是否有一种惯用的方式允许将非常量T的对象转换为const T的对象?

基本上,我希望以下转换隐式发生:

void f(myclass<const int> x);

myclass<int> a;
f(a); // should compile

重要编辑:

答案似乎很琐碎(问题很愚蠢),但是涉及到一些概念上的问题(至少对我而言)。

我觉得我需要有条件地启用转换运算符,因为从myclass<const T>myclass<const T>的转换运算符没有任何意义,即,如果和只有T符合const的条件。我期望编译器抱怨冗余的转换运算符。

现在,假设编译器对将类型X转换为X的身份转换运算符感到满意,那么赋值运算符或副本构造函数与身份转换运算符之间有什么区别?

MSVC向身份转换运算符发出警告。这不是很好。

1 个答案:

答案 0 :(得分:5)

您可以使用转换操作符执行此操作,该操作符返回类型为const限定的myclass。看起来像

template<typename T>
struct myclass
{
    T foo;
    operator myclass<const T>() { return myclass<const T>{foo}; }
};

然后在

int main() 
{ 
    myclass<int> a{42};
    f(a); // should compile
}

编译器会为您隐式调用它。


如果您已经有一个myclass<const int>并将其传递给f,则不必担心任何歧义,因为复制构造函数是完全匹配的,因此即被称为。但是,如果您确实想在T已经const时禁用转换运算符,则可以使用

template<typename U = T, std::enable_if_t<!std::is_const_v<U>, bool> = true> 
operator myclass<const U>() { return myclass<const U>{foo}; }