Использование std :: invoke для вызова шаблонной функции - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь вызвать шаблонную функцию-член, используя std::invoke, как показано в приведенном ниже коде.

#include <functional>
#include <iostream>

struct Node
{
    template <typename T>
    T eval(T lhs, T rhs) { return lhs + rhs; }
};

int main(void)
{
    std::cout << std::invoke(&Node::eval<int>, 1, 2);

    return 0;
}

GCC 8.1 дает мне ошибку

нет соответствующей функции для вызова 'invoke (неразрешенная перегружена тип функции, int, int) '

что, я думаю, означает, что шаблон функции фактически не создается.

Чего мне не хватает, чтобы сделать звонок возможным?

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Две проблемы:

Во-первых, шаблон вашей функции принимает один параметр типа, а не два.
Во-вторых, ваша функция не static, поэтому вы не можете использовать ее без объекта.

struct Node
{
    template <typename T>
    static T eval(T lhs, T rhs) { return lhs + rhs; }
    ^^^^^^
};

int main(void)
{
    std::cout << std::invoke(&Node::eval<int>, 1, 2);
                                         ^^^
    return 0;
}
0 голосов
/ 06 января 2019

Проблема в том, что вы пытаетесь вызвать функцию member без объектов. Есть два решения:

  1. Пометить eval как static.
  2. Создайте объект Node и std::invoke метод eval для этого объекта. Это будет выглядеть так:

    int main()
    {
        Node n{};
        std::cout << std::invoke(&Node::eval<int>, n, 1, 2);
    
        return 0;
    }
    

Здесь объект n передается как объект для this указателя на метод eval.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...