2017-10-19 151 views
1

我有一个由两个模板定义的类。定义从模板类到基于其他模板的原始类型的隐式转换

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整个班级?

+0

不幸的是,我刚刚发现我的答案实际上并没有工作......看起来,这会禁用整个类实例化,而不仅仅是操作符......你能不接受它,所以我可以删除它吗? :) – Knoep

+0

好的,发现另一个(更简单)的解决方案。这仍然是你想要的吗? – Knoep

+0

我目前正在使用你给出的第一个解决方案'template :: value,void> :: type>'。它似乎工作,但我可能没有足够彻底的测试。你最好的解决方案是什么?提前致谢! – mbtg

回答

1

可以使用static_assert检查,如果转换应该被允许:

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

然而,这意味着你不能有一个明确的转换为A,如果Bspecific_B_type。如果您需要,可以查看this有关基于模板参数添加和删除成员的问题的答案。