如何在不使用“运算符”一词的情况下调用模板化的运算符重载?
class RunAround;
class HopUpAndDown;
class Sleep;
template<typename Acts> int doThis();
template<> int doThis<RunAround>() { /* run run run.. */ return 3; }
template<> int doThis<HopUpAndDown>() { /* hop hop hop.. */ return 2; }
template<> int doThis<Sleep>() { /* zzz.. */ return -2; }
struct Results
{
template<typename Act> int& operator()()
{
static int result;
return result;
}
};
int main()
{
Results results;
//results<RunAround>() = doThis<RunAround>();
results.operator()<RunAround>() = doThis<RunAround>();
results.operator()<Sleep>() = doThis<Sleep>();
return 0;
};
如果我删除了评论,编译器认为我是在不存在的模板类Results<RunAround>
调用operator()
,当我想在Results
类operator<RunAround>()
。如何在不使用“运算符”一词的情况下调用模板化的运算符重载?
如果我想继续使用运算符重载而不是普通名称,我注定要在评论下面使用可怕的语法吗?
最舒服的事情就是让模板实参推演为你工作:
struct Results {
template<typename Act> int& operator()(Act) { /* ... */ }
};
results(RunAround()) = /* ... */;
但是,这增加了实例化一个对象,传递一个参数,并要求RunAround而不是一个简单的前向声明的定义的开销... – Kyle 2010-05-15 16:31:00
开销是微不足道的优化为编译器(至少如果构造函数不对外部物体有副作用)。至于是否需要一个定义:如果你选择了一个这种类型的模板,我想你可能想用它做点什么。这里只有两个选择:您可以使用参数推导或明确指定模板参数。 – 2010-05-15 16:39:57
或者你可以把它包装到一些空的类中。像'结果(身份
我真的建议使其成为一个名为'GET'功能。 – GManNickG 2010-05-15 18:09:18