转换运算符与模板的重载

时间:2018-11-14 11:55:59

标签: templates overloading operator-keyword

我希望能够将myclass转换为任何基本结构(double,int,float等)。我用过:

template<class T> myclass::operator T() {
    return (T)a;
};

但是运行它会给我一个错误。但是,如果我使用:

myclass::operator double() {
    return (double)a;
};

(a是一个私有变量)代码有效。

在这种情况下如何使用模板?

谢谢

1 个答案:

答案 0 :(得分:0)

要使其完全起作用,a必须可转换为doubleintfloat。然后,您的第一个示例应该可以正常工作。我通过static_assert添加了额外的强制执行。

#include <type_traits>

class myclass {
    double a = 1.0;
public:
    template<class T> operator T() {
        static_assert(std::is_convertible_v<decltype(a),T>);
        return static_cast<T>(a);
    };
};

int main() {
    myclass m;

    int i = m;
    float f = m;
    double d = m;
  //std::string s = m; // BOOM!
}

Live on Wandbox