Toj*_*oji 31 c++ templates operator-overloading
在C++中,你可以在一个类上有一个模板化运算符吗?像这样:
class MyClass {
public:
template<class T>
T operator()() { /* return some T */ };
}
Run Code Online (Sandbox Code Playgroud)
这实际上似乎编译得很好,但混淆在于如何使用它:
MyClass c;
int i = c<int>(); // This doesn't work
int i = (int)c(); // Neither does this*
Run Code Online (Sandbox Code Playgroud)
它编译的事实向我暗示它是可行的,我只是对如何使用它感到茫然!有什么建议,或者这种使用方法是非首发?
ava*_*kar 45
你需要指定T
.
int i = c.operator()<int>();
Run Code Online (Sandbox Code Playgroud)
不幸的是,在这种情况下,您无法直接使用函数调用语法.
编辑:哦,你在public:
课程定义的开头就错过了.
jal*_*alf 18
你基本上是对的.定义模板化运算符是合法的,但不能使用显式模板参数直接调用它们.
如果你有这个运营商:
template <typename T>
T operator()();
Run Code Online (Sandbox Code Playgroud)
在您的示例中,它只能像这样调用:
int i = c.operator()<int>();
Run Code Online (Sandbox Code Playgroud)
当然,如果模板参数可以从参数推断出来,你仍然可以按正常方式调用它:
template <typename T>
T operator()(T value);
c(42); // would call operator()<int>
Run Code Online (Sandbox Code Playgroud)
另一种方法是将参数作为引用,并将输出存储在那里,而不是返回它:
template <typename T>
void operator()(T& value);
Run Code Online (Sandbox Code Playgroud)
所以不是这样的:
int r = c.operator()<int>();
Run Code Online (Sandbox Code Playgroud)
你能做到的
int r;
c(r);
Run Code Online (Sandbox Code Playgroud)
或许您应该只定义一个简单的get<T>()
函数而不是使用运算符.