шаблоны — c ++ выводит тип указателя на функцию

Можно ли вывести не типа тип указателя функции аргумент шаблона (указатель на функцию) из аргумента функции?

template <void(*fptr)()>
void test(void(*fp)()) { fp(); }

чтобы вызвать эту функцию, я должен явно объявить параметр шаблона функции:

test<somefunc>(somefunc);

Я знаю, что я мог бы сделать это так:

template <void(*fptr)()>
void test() { fp(); }

test<somefunc>();

Но мне просто интересно, возможно ли это сделать так:

template <void(*fptr)()>
void test() { fp(); }

test(somefunc);

Можно ли объявить таким образом, что компилятор (GCC 4.7) будет выводить из аргументов функции?

Большое спасибо заранее, очень интересно, как это сделать.
-Bryan

1

Решение

Брайан, это довольно эксцентричная смесь низкоуровневых С и С ++. Зачем тебе это надо? Почему бы не использовать функторы?

struct clean
{
void operator() ()
{
// do something here
}
};

template <typename FuncType> void call_func(FuncType func)
{
func();
}

// here is how to pass 'clean' to be called
call_func(clean());

Подробнее о функторах, например, здесь: http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html

1

Другие решения

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

Нет. Аргументы функции являются объектами времени выполнения, а аргументы шаблона — объектами времени компиляции. Чтобы быть выведенным, такой аргумент шаблона должен быть выведен во время выполнения, что просто невозможно.

4

Я это, это может делать то, что вы хотите:

Объявите базовый шаблон, у которого еще нет типа функции:

template <typename T> void test(T fp) { printf("function signature not supported\n"); }

Специализируйтесь на типах функций (в основном количество аргументов):

typedef void(fptr0)();
template <> void test(fptr0 fp) { fp(); }
typedef void(fptr1)(int);
template <> void test(fptr1 fp) { fp(1); }

Объявите несколько тестовых функций с разными сигнатурами:

void myfn0() { printf("hi 0\n"); }
void myfn1(int x) { printf("hi 1:%i\n",x); }
void myfnD(float y) { printf("hi D %f\n",y); }

Теперь выполните их:

int main(int,char**) {
test(myfn0);
test(myfn1);
test(myfnD);
return 0;
}

Результат:

hi 0
hi 1:1
function signature not supported
1

Это то, что вы ищете?

#include <iostream>

typedef void (*fptr)();

void f() {
std::cout << "hello, world\n";
}

template <class fptr> void g(fptr fp) {
fp();
}

int main() {
g(f);
return 0;
}
0
По вопросам рекламы [email protected]