Можно ли вывести не типа тип указателя функции аргумент шаблона (указатель на функцию) из аргумента функции?
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
Брайан, это довольно эксцентричная смесь низкоуровневых С и С ++. Зачем тебе это надо? Почему бы не использовать функторы?
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
Можно ли вывести нетипичный аргумент шаблона (указатель на функцию) из аргумента функции?
Нет. Аргументы функции являются объектами времени выполнения, а аргументы шаблона — объектами времени компиляции. Чтобы быть выведенным, такой аргумент шаблона должен быть выведен во время выполнения, что просто невозможно.
Я это, это может делать то, что вы хотите:
Объявите базовый шаблон, у которого еще нет типа функции:
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
Это то, что вы ищете?
#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;
}