【发布时间】:2017-10-19 23:27:08
【问题描述】:
我有一个由两个模板定义的类。
template<typename A, typename B> my_class {
private:
A value;
public:
operator A () {
return this->value;
}
};
我想在模板中定义类和第一种类型之间的隐式转换,但只针对模板上的特定第二种类型。由于A 是C++ 原始类型,我无法在该侧定义转换。我试过这样std::enable_if
operator typename std::enable_if<std::is_same<B, specific_B_type>::value, NumT>::type () {
return this->value;
}
但我得到编译错误
Error C2833 'operator type' is not a recognized operator or type dimensional_analysis
有没有什么方法可以做到这一点,而不必为B = specific_B_type 专门定义整个类?
【问题讨论】:
-
不幸的是,我刚刚发现我的答案实际上不起作用...似乎这会禁用整个类实例化,而不仅仅是运算符...您可以不接受它,所以我可以删除它? :)
-
好的,找到另一个(更简单的)解决方案。这还是你想要的吗?
-
我目前正在使用您提供的第一个解决方案
template<typename Constraint = typename std::enable_if<std::is_same<B, specific_B_type>::value, void>::type>。它似乎有效,但我可能没有对它进行足够彻底的测试。你最好的解决方案是什么?提前致谢! -
你有没有试过创建一个类的实例,
B != specific_B_type?我似乎基于类模板参数选择性地禁用成员函数不起作用,因为即使从未使用过该函数,也不可能有一个具有不明确成员函数的类。 -
最佳解决方案取决于您的用例。如果您只想在尝试使用隐式转换和
B != specific_B_type时获得编译时错误,那么您应该使用我的新解决方案。它很简单,允许您指定自定义错误消息。如果您想要一些更复杂的东西,例如允许对某些B进行隐式转换,否则进行显式转换,您可以查看我发布的链接中的解决方案。然而,所有这些都涉及更多。
标签: c++ templates implicit-conversion