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

18

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

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

#include <iostream>

using namespace std;

int multiply(int x, int y)
{
    return x * y;
}

template <class F>
void foo(int x, int y, F f)
{
    cout << f(x, y) << endl;
}

template <class F>
void bar(int x, int y)
{
    cout << F(x, y) << endl;
}

int main()
{
    foo(3, 4, multiply); // works
    bar<multiply>(3, 4); // fails

    return 0;
}
Также смFunction passed as template argument. jww

Ваш Ответ

2   ответа
30

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

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

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

тогда это сработает. Посмотреть онлайн демо:http: //ideone.com/qJrA

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

typedef int (*Fun)(int,int);

template <Fun F> //now it'll accept multiply (i.e value)
void bar(int x, int y)
{
    cout << F(x, y) << endl;
}
Спасибо за ясное объяснение! tajmahal
7

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

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

struct Type {
  const int result;
  Type(int x, int y): result(x * y) {}
  operator int() const { return result; }
};

// usage
bar<Type>(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<std::string>(64, 64);
Если он собирается использовать это, тогда ему нужно изменитьсяbar также. СинтаксисF(x,y) должно статьF(x,y)(). Nawaz
@ Наваз Нет,Type на самом деле не функтор. Это просто тип с подходящим конструктором и перегрузкой выходного потока (в этом случае подходящий оператор преобразования, у которого уже есть перегрузка выходного потока). (видеть Ideone.com / AgQGc) eq-
Ооо .. Я упустил это из виду ... возможно, потому что функтор был бы лучшей альтернативой здесь, поэтому я ожидал этого. Nawaz

Похожие вопросы