添加其他答案,您可以利用以下事实:
decltype(Hello)
计算结果为int (int)
(不是函数指针类型);
- 函数可以隐式转换为指向自身的指针;这种转换几乎无处不在(例如通过值传递函数(?)而不是函数指针?)。
以下代码:
#include <type_traits>
template<class F>
struct A
{
A(F foo) : bar(foo) {}
typename std::conditional<std::is_function<F>::value,
typename std::add_pointer<F>::type,
F>::type bar;
};
是一个通用解决方案,允许函数、函数指针、仿函数和 lambda 具有相同的语法:
#include <type_traits>
#include <iostream>
void Hello() { std::cout << "Function\n"; }
struct Hello2 { void operator()() { std::cout << "Struct\n"; } };
void Hello3() { std::cout << "Function pointer\n"; }
template<class F>
struct A
{
A(F foo) : bar(foo) { bar(); }
std::conditional_t<std::is_function<F>::value, std::add_pointer_t<F>, F> bar;
};
int main()
{
A<decltype(Hello)> a(Hello);
Hello2 h2;
A<decltype(h2)> b(h2);
A<decltype(&Hello3)> c(&Hello3);
auto Hello4 = []() { std::cout << "Lambda\n"; };
A<decltype(Hello4)> d(Hello4);
}
(这里我利用 C++14 特性稍微改变了解决方案)。
Indeedstd::function
是一个(并不总是更好的)替代方案。