использование шаблонов с аргументами указателя на функцию - PullRequest
0 голосов
/ 21 сентября 2011

Мне было интересно, как использовать шаблон с указателем на функцию в качестве аргумента. Например,

template<typename T> someFunction(T /*?*/) {}

где T - указатель на функцию (например, void (*)(int,int*,double))

Я хочу использовать это, чтобы обойти проблему различий для указателей функций двух функций, таких как:

void function(int,int);
void class::function(int,int);

Итак, если указатели на функции не работают, есть ли другой способ?

Редактировать: В основном мне нужно сделать функцию, которая принимает различные функции, используя шаблон (так же, как обычная функция шаблона принимает различные переменные).

Ответы [ 3 ]

0 голосов
/ 21 сентября 2011

Вы можете использовать функторы вместо указателей на функции-члены. Пример:

class SomeFunctor {
public:
    void operator()(int i, int* ip, double d)
    {
    }
};

void someFunction(int i, int* ip, double d)
{
}

template<typename T>
void doSomething(T f)
{
    int i = 0, j = 0;
    int* ip = &j;
    double d;

    f(i, ip, d);
}

SomeFunctor someFunctor;
doSomething(someFunctor);
doSomething(someFunction);

Обратите внимание, что я не тестировал этот код, и поэтому могут потребоваться некоторые изменения для его компиляции.

0 голосов
/ 01 декабря 2011

Вы должны посмотреть на std :: function;это обобщенный способ удержания «функтора», который вы можете назвать.(См. Ответ npclaudiu для примера одного типа функтора)

Как говорится, K-балл верен, функция-член отличается от свободной функции, потому что она требует объекта.Обычно это реализуется передачей скрытого параметра;Вы можете называть это "этим".

Поэтому, когда вы пишете void my_class::function(int,int);

Компилятор действительно генерирует void my_class::function (my_class*,int,int);

Вы можете использовать std :: bind для связывания данных и функций - для создания функторов налетать.Лучший учебник, который я знаю, для Boost.Bind

0 голосов
/ 21 сентября 2011

Указатели на функции-члены отличаются от указателей функций, например, для них есть дополнительный аргумент this.Не совсем понятно, что вы пытаетесь достичь, звучит как Boost.Function / Bind поможет.Обратите внимание, что они являются стандартными с TR1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...