вызов функтора (дополнительные символы) - PullRequest
2 голосов
/ 01 июня 2011

Я попытался построить минимальный пример:

struct Functor
{
    void operator()(int& a)
    {
        a += 1;
    }
    void other(int& a)
    {
        a += 2;
    }
};

template <typename foo>
class Class
{
    public:
        void function()
        {
            int a = 10;
            foo()(a);
            std::cout << a << std::endl;
        }
};

int main()
{
    Class<Functor> c;
    c.function();
}

Мой вопрос по этому поводу: почему вообще возможно вызвать оператор чистого типа без объекта? Как я могу вызвать функцию other так же, как я вызываю operator()?

Ответы [ 3 ]

8 голосов
/ 01 июня 2011

Вы не называете это в чистом виде. foo() вызывает конструктор и вычисляет временный объект foo, для которого вы затем вызываете operator().

Чтобы сделать эквивалент с «нормальной» функцией-членом, просто выполните:

foo().other(a);
3 голосов
/ 01 июня 2011

Вы не "вызываете оператор на чистом типе без объекта" .Синтаксис foo()(a) создает временный тип foo (это часть foo()), а затем вызывает operator() для этого объекта с a в качестве аргумента: (часть (a)).

2 голосов
/ 01 июня 2011

Пример чистого типа:

struct Functor
{
    void operator()(int& a)
    {
        a += 1;
    }
    void other(int& a)
    {
        a += 2;
    }
    static void one_more(int& a)
    {
        a += 3;
    }
};

template <typename foo>
class Class
{
    public:
        void function()
        {
            int a = 10;
            foo()(a);
            foo().other(a);
            foo::one_more(a);
            std::cout << a << std::endl;
        }
};

int main()
{
    Class<Functor> c;
    c.function();
}
...