如何在不使用“运算符”一词的情况下调用模板化的运算符重载?

问题描述:

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(),当我想在Resultsoperator<RunAround>()如何在不使用“运算符”一词的情况下调用模板化的运算符重载?

如果我想继续使用运算符重载而不是普通名称,我注定要在评论下面使用可怕的语法吗?

+0

我真的建议使其成为一个名为'GET'功能。 – GManNickG 2010-05-15 18:09:18

最舒服的事情就是让模板实参推演为你工作:

struct Results { 
    template<typename Act> int& operator()(Act) { /* ... */ } 
}; 

results(RunAround()) = /* ... */; 
+2

但是,这增加了实例化一个对象,传递一个参数,并要求RunAround而不是一个简单的前向声明的定义的开销... – Kyle 2010-05-15 16:31:00

+0

开销是微不足道的优化为编译器(至少如果构造函数不对外部物体有副作用)。至于是否需要一个定义:如果你选择了一个这种类型的模板,我想你可能想用它做点什么。这里只有两个选择:您可以使用参数推导或明确指定模板参数。 – 2010-05-15 16:39:57

+0

或者你可以把它包装到一些空的类中。像'结果(身份())= ...;'将参数更改为'模板 int&operator()(identity ){...}' – 2010-05-18 17:37:49