【问题标题】:define implicit conversion from template class to primitive type based on other template基于其他模板定义从模板类到原始类型的隐式转换
【发布时间】: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&lt;typename Constraint = typename std::enable_if&lt;std::is_same&lt;B, specific_B_type&gt;::value, void&gt;::type&gt;。它似乎有效,但我可能没有对它进行足够彻底的测试。你最好的解决方案是什么?提前致谢!
  • 你有没有试过创建一个类的实例,B != specific_B_type?我似乎基于类模板参数选择性地禁用成员函数不起作用,因为即使从未使用过该函数,也不可能有一个具有不明确成员函数的类。
  • 最佳解决方案取决于您的用例。如果您只想在尝试使用隐式转换和B != specific_B_type 时获得编译时错误,那么您应该使用我的新解决方案。它很简单,允许您指定自定义错误消息。如果您想要一些更复杂的东西,例如允许对某些 B 进行隐式转换,否则进行显式转换,您可以查看我发布的链接中的解决方案。然而,所有这些都涉及更多。

标签: c++ templates implicit-conversion


【解决方案1】:

您可以使用static_assert 来检查是否应允许转换:

operator A() 
{
    static_assert(std::is_same<B, specific_B_type>::value, "No conversion possible");    
    return this->value;
}

但是,这意味着如果 B 不是 specific_B_type,则不能显式转换为 A。有需要的可以看看thisquestion关于根据模板参数添加和删除成员的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多