带有运算符的函数模板

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:课程定义的开头就错过了.

  • 是的,你最好定义一个`get`方法而不是`operator()`.然后你可以写`c.get <int>()`. (5认同)

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>()函数而不是使用运算符.