在C ++中,你可以在一个类上有一个模板化运算符吗?像这样:
class MyClass {
public:
template<class T>
T operator()() { /* return some T */ };
}
这实际上似乎编译得很好,但混淆在于如何使用它:
MyClass c;
int i = c<int>(); // This doesn't work
int i = (int)c(); // Neither does this*
它编译的事实向我暗示它是可行的,我只是对如何使用它感到茫然!有什么建议,或者这种使用方法是非首发?
答案 0 :(得分:44)
您需要指定T
。
int i = c.operator()<int>();
不幸的是,在这种情况下你不能直接使用函数调用语法。
编辑:哦,你在课程定义的开头缺少public:
。
答案 1 :(得分:18)
你基本上是对的。定义模板化运算符是合法的,但不能使用显式模板参数直接调用它们。
如果你有这个操作员:
template <typename T>
T operator()();
如在您的示例中,它只能像这样调用:
int i = c.operator()<int>();
当然,如果模板参数可以从参数推断出来,你仍然可以用正常方式调用它:
template <typename T>
T operator()(T value);
c(42); // would call operator()<int>
另一种方法是将参数作为引用,并将输出存储在那里,而不是将其返回:
template <typename T>
void operator()(T& value);
所以不要这样:
int r = c.operator()<int>();
你可以做到
int r;
c(r);
或许您应该只定义一个简单的get<T>()
函数,而不是使用运算符。
答案 2 :(得分:4)
你不是在想
class Foo {
public:
template<typename T>
operator T() const { return T(42); }
};
Foo foo;
int i = (int) foo; // less evil: static_cast<int>(foo);
live example。这证明您不需要指定模板参数,尽管在接受的答案中有声明。