`class<T>` 到 `class<const T>` 转换运算符的惯用方式
idiomatic way for `class<T>` to `class<const T>` conversion operator
假设有一个模板class 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 对标识转换运算符发出警告。这不太好。
您可以使用 returns 类型为 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}; }
假设有一个模板class 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 对标识转换运算符发出警告。这不太好。
您可以使用 returns 类型为 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}; }