带有运算符的函数模板 C++中,你可以在一个类上有模板操作符吗?像这样: class MyClass { public: template<class T> T operator()() { /* return some T */ }; } class-MyClass{ 公众: 模板 T操作符(){/*返回一些T*/}; }

带有运算符的函数模板 C++中,你可以在一个类上有模板操作符吗?像这样: class MyClass { public: template<class T> T operator()() { /* return some T */ }; } class-MyClass{ 公众: 模板 T操作符(){/*返回一些T*/}; },c++,templates,operator-overloading,C++,Templates,Operator Overloading,这实际上似乎很好,但混淆之处在于如何使用它: MyClass c; int i = c<int>(); // This doesn't work int i = (int)c(); // Neither does this* myc类; int i=c();//这不管用 int i=(int)c();//这也不是* 它编译的事实向我表明它是可行的,我只是不知道如何使用它!是否有任何建议,或者这种使用方法是非初学者?您需要指定T int i = c.operator()<in

这实际上似乎很好,但混淆之处在于如何使用它:

MyClass c;
int i = c<int>(); // This doesn't work
int i = (int)c(); // Neither does this*
myc类;
int i=c();//这不管用
int i=(int)c();//这也不是*

它编译的事实向我表明它是可行的,我只是不知道如何使用它!是否有任何建议,或者这种使用方法是非初学者?

您需要指定
T

int i = c.operator()<int>();
inti=c.运算符();
不幸的是,在这种情况下不能直接使用函数调用语法


编辑:哦,你在类定义的开头缺少了
public:

你基本上是对的。定义模板化运算符是合法的,但不能使用显式模板参数直接调用它们

如果您有此操作员:

template <typename T>
T operator()();
或者,您应该只定义一个简单的
get()
函数,而不是使用运算符。

您不考虑

class Foo {
    public:
    template<typename T>
    operator T() const { return T(42); }
};

Foo foo;

int i = (int) foo; // less evil: static_cast<int>(foo);
class-Foo{
公众:
模板
运算符T()常量{返回T(42);}
};
富富,;
int i=(int)foo;//减少邪恶:静态施法(foo);

。这证明您不需要指定模板参数,尽管接受的答案中有声明。

这是什么意思“这不起作用/这也不起作用”?发生了什么?编译器吐在你身上,就是这样发生的:)我发誓我以前看过这个问题……但我找不到它,所以显然不能怪你。啊,找到了:谢谢。我猜我只是在尝试搜索时输入了错误的关键字。(没有想到尝试functor。回想起来,这应该是显而易见的)很好。快速准确的回答令人赞叹!不幸的是,这对于我的使用来说可能过于冗长(因为我的代码是要被其他人调用的,我希望避免混淆),所以我只需要找到另一条路径。再次感谢!是的,您最好定义一个
get
方法,而不是
operator()
。然后你可以编写
c.get()
。实际上,有一个习语被很多人使用:free-get函数(元组使用
get(some-tuple)
,boost.variant使用
get(some-variant)
)。因此,您的调用看起来像
get(c)
,在
MyClass
的命名空间中定义了
get
)。我为返回的版本实现了Evaluate(),为非返回的版本实现了Execute(),然后允许用户调用()操作符作为求值的替代方法。(这些名称在上下文中很有意义,因为它们是在执行脚本中定义的函数。)因此,本质上,是的,我实现了一个get函数:)感谢所有的建议!在这种情况下可以工作,但我考虑的是
c++
。我的意思是这不应该起作用,我有点滥用符号…@kim366:既然那没有意义,想起来就没有意义了。它不应该起作用,也不起作用。
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);
class Foo {
    public:
    template<typename T>
    operator T() const { return T(42); }
};

Foo foo;

int i = (int) foo; // less evil: static_cast<int>(foo);