Конкретная функция в качестве аргумента шаблона по умолчанию - PullRequest
1 голос
/ 13 марта 2020

Возможно ли в C ++ установить в качестве аргумента шаблона по умолчанию конкретную (бесплатную) функцию?

Я имею в виду нечто подобное:

void foo() {}

template <typename F = foo>
struct C 
{
    F f;
};

1 Ответ

4 голосов
/ 13 марта 2020

Указатель функции является нетиповым параметром шаблона.

template <auto F = &foo> // c++17
template <void(*F)() = &foo>

Вот полный пример:

#include <iostream>

void foo() { std::puts("foo"); }
void bar() { std::puts("bar"); }

template <void (*F)() = &foo>
struct Foo {
  void exec() { F(); }
};

int main() {
  Foo a;
  Foo<&bar> b;

  a.exec(); // prints "foo"
  b.exec(); // prints "bar"
}

Если вам нужно сохранить По какой-то причине указатель на функцию (как вы сделали в своем фрагменте), вы можете сделать это, объявив decltype(F) f = F; членом класса.

...