Как вызвать шаблонную перегрузку оператора без использования слова «оператор»? - PullRequest
0 голосов
/ 15 мая 2010
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;
};

Если я удаляю комментарий, компилятор считает, что я звоню operator() в несуществующем шаблонном классе Results<RunAround>, когда я хочу operator<RunAround>() в классе Results.

Если я хочу продолжать использовать перегрузку оператора вместо обычного имени, обречен ли я использовать ужасный синтаксис под комментарием (что работает)?

1 Ответ

1 голос
/ 15 мая 2010

Самое удобное - позволить вывод аргументов шаблона работать на вас:

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

results(RunAround()) = /* ... */;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...