Указатель на функцию с ошибкой «не тип» при использовании шаблона в файле интерфейса - PullRequest
4 голосов
/ 23 сентября 2019

Я создаю интерфейсный файл для моей библиотеки с помощью метода передачи указателя на функцию.Существует 2 подхода:

A: определен как функция-член класса шаблона

B: определен как глобальный

// A:
template<typename T>
using fcnPtr1 = void (T::*)(const int&);

// B:
typedef void(*fcnPtr2)(const int&);

class TestInterface
{
public:
    // A: This cause error 'fcnPtr1' is not a type
    virtual void setCallback(fcnPtr1 callback) = 0;

    // B: This is OK
    virtual void setCallback(fcnPtr2 callback) = 0;
};

На данный момент подход A даетмне ошибка "fcnPtr1" не является типом, но подход B в порядке.

Мне нужно использовать подход A, потому что я не хочу, чтобы мой клиент определял функцию обратного вызова в глобальном масштабе.Любой совет?

1 Ответ

3 голосов
/ 23 сентября 2019

В вашем коде fcnPtr1 это шаблон.Поскольку это шаблон, вам нужно предоставить тип шаблона для его создания.Это в основном отменяет то, что вы только что сделали, поэтому бесполезно

Если вам нужно использовать произвольные функции, но вы хотите контролировать только сигнатуру, тогда вы можете использовать std::function.Используя параметр std::function, вы можете выбрать любой тип вызываемого объекта, имеющий соответствующую сигнатуру функции.Это превратит ваш код в

class TestInterface
{
public:
    virtual void setCallback(std::function<void(const int&)> callback) = 0;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...