Можно ли определить тип для «указателя на функцию шаблона»?

0

Можно ли определить тип для "указателя функции шаблона"? Такие как

void (*tfp<99>)(); // can't compile

так же, как класс шаблона:

Someclass<99>();

Чтобы объяснить мою проблему дальше, у меня есть следующий код:

template <int N>
class Foo {};

template <int N>
void foo() {}

template <int N, template <int> class OP>
void test_foo(OP<N> op) { std::cout << N << std::endl; }

Я могу вызвать test_foo(Foo<99>()), но не могу вызвать test_foo() с аргументом foo<99>:

test_foo(Foo<99>());                    //OK
test_foo(foo<99>);                      //error: candidate template ignored: could not match '<N>' against 'void (*)()'
test_foo<void (*)()>(foo<99>);          //error: candidate template ignored: invalid explicitly-specified argument for template parameter 'N'
test_foo<void (*<99>)()>(foo<99>);      //error: expected expression
test_foo<void (*<99>)()<99> >(foo<99>); //error: expected expression

Есть ли подход, который может получить параметр шаблона N в test_foo() из аргумента foo<99> же, как test_foo(Foo<99>())?

Теги:
templates

1 ответ

1
Лучший ответ

Вы можете в С++ 11 с псевдонимами шаблонов:

template <int V> using fptr = void (*tfp<V>)();

Вы не можете делать "черты" для этих значений fptr (или выводить аргументы шаблона из параметра функции &foo<N>), поскольку значение экземпляра шаблона функции не кодирует аргументы шаблона в результирующий тип.

Это отличается от шаблонов классов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню