带有运算符的函数模板

时间:2009-07-12 18:49:58

标签: c++ templates operator-overloading

在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*

它编译的事实向我暗示它是可行的,我只是对如何使用它感到茫然!有什么建议,或者这种使用方法是非首发?

3 个答案:

答案 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。这证明您不需要指定模板参数,尽管在接受的答案中有声明。