Передавать функцию как явный параметр шаблона

В приведенном ниже примере кода вызов foo работает, а вызов на bar заканчивается.

Если я прокомментирую вызов в bar , компиляция кода, которая говорит мне, что определение самого bar в порядке. Так как можно было бы назвать bar правильно?

 #include  using namespace std; int multiply(int x, int y) { return x * y; } template  void foo(int x, int y, F f) { cout << f(x, y) << endl; } template  void bar(int x, int y) { cout << F(x, y) << endl; } int main() { foo(3, 4, multiply); // works bar(3, 4); // fails return 0; } 

Проблема здесь заключается в том, что multiply не является типом ; это значение, но bar шаблонов функций ожидает, что аргумент шаблона будет типом . Отсюда и ошибка.

Если вы определяете шаблон функции как:

 template  //now it'll accept multiply (ie value) void bar(int x, int y) { cout << F(x, y) << endl; } 

то он будет работать. Смотрите онлайн-демонстрацию: http://ideone.com/qJrAe

Вы можете упростить синтаксис, используя typedef как:

 typedef int (*Fun)(int,int); template  //now it'll accept multiply (ie value) void bar(int x, int y) { cout << F(x, y) << endl; } 

multiply – это не тип, это функция. В этом контексте он распадается на указатель функции. Тем не менее, шаблон шаблона предназначен для типа, который, опять же, multiply .

Наваз уже ответил на вопрос по-другому (как изменить определение bar который будет использоваться с функциями), но чтобы ответить на ваш явный вопрос о том, как вызвать bar как у вас есть, вам нужен подходящий тип, например:

 struct Type { const int result; Type(int x, int y): result(x * y) {} operator int() const { return result; } }; // usage bar(x, y); // (edit) a suitable type doesn't necessarily mean a new type; this works as well // if you aren't trying to solve any specific problem bar(64, 64);