c++ - `class<T>` 到 `class<const T>` 转换运算符的惯用方式

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

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

是否有惯用的方法允许转换非常量对象 Tconst 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 对身份转换运算符发出警告。这不太好。

最佳答案

您可以使用返回 myclass 的转换运算符来执行此操作类型 const 合格。看起来像

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}; }

关于c++ - `class<T>` 到 `class<const T>` 转换运算符的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55656256/

相关文章:

c++ - 使用 {745a17a0-74d3-11d0-b6fe-00a0c90f57da} 格式的值初始化 GUID

C++ char*[] 到 char** 的转换

Delphi 'in' 集合上的运算符重载

c++ - 命名空间参数的理想架构设计

c++ - http_listener casablanca 不从公共(public)方法绑定(bind)

android - 在android中实现高通音频滤波器

swift - 在 Swift 中将字节数组转换为 double

c++ - 在 C++ 中重载复合赋值运算符

c++ - 您可以引用在结构中定义的友元运算符吗?

c++ - 有没有一种方法可以排除C++数组中的行和列?