Невозможно создать функциональный шаблон в c++

Я пытаюсь создать класс шаблона, который принимает в качестве параметров шаблона тип возвращаемого значения и параметры функции, например: new static_detour<int(const char*, int)>()

Поскольку это тот же синтаксис, который мы видим в шаблоне функции std, я попытался скопировать ту же структуру, что и в function.h, так что это мой класс:

template<typename Result, typename ... Arguments>
class static_detour<Result(Arguments...)>
{
}

Однако это не работает, и когда я пытаюсь использовать этот файл из файла .cpp, компилятор выдает error C2988: unrecognizable template declaration/definition. Я удаляю <> после имени класса, который компилируется нормально, но тогда я не могу использовать параметр Arguments.

Возможно ли это в C++, или я что-то не так делаю?

что вы имеете в виду под «тогда я не могу использовать параметр аргументы»? ? конечно вы можете использовать их

463035818_is_not_a_number 13.09.2018 21:22

Если я добавляю такую ​​функцию, как Result myFunction();, а затем вызываю ее, компилятор сообщает error C2091: function returns function, поскольку он пытается вернуть весь int(const char*, int)> как Результат.

eric.m 13.09.2018 21:24
1
2
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо объявить начальный, неограниченный шаблон класса, который определяет количество аргументов шаблона, требуемых классу:

template <class T>
class static_detour;

до вы можете объявить любой полный или частичный специализации шаблона класса, который принимает только определенные аргументы:

template<typename Result, typename ... Arguments>
class static_detour<Result(Arguments...)>
{
}

Тип static_detour<T> будет относиться к специализации, если T имеет форму Result(Arguments...) для некоторых Result и Arguments..., то есть, если вычет по специализации успешен. В противном случае он будет относиться к основному шаблону.

Спасибо, работает! Хотя мне пришлось удалить <T> из static_detour <T>.

eric.m 13.09.2018 21:27

Ага, должно быть, это была опечатка. @ Брайан, вам не нужен <T> в вашем первом объявлении.

Fureeish 13.09.2018 21:28

Ага, извини, у меня плохо.

Brian Bi 13.09.2018 21:39

Другие вопросы по теме