template<class T>
struct IsFunc
{
typedef char one;
typedef struct
{
char dummy_[2];
} two;
static one f(...);
static two f(T (*)[1]);
enum {value = (sizeof(f<T>(0)) == 1)};
};
如果我尝试在main中运行它:
void functionA();
int _tmain(int argc, _TCHAR* argv[])
{
int a = 0;
cout << IsFunc<functionA>::value;//<=--------HERE
return 0;
}
我收到一个错误:
错误1错误C2923:'IsFunc':'functionA'不是有效的模板类型
我做错了什么?
感谢
答案 0 :(得分:3)
functionA
是一个函数,而不是一个类型,因此它不能成为期望类型的IsFunc
的有效模板参数。
如果需要模板来检测类型是否是函数类型,则已经boost::is_function
(它是TR1 / C ++ 0x的一部分)。
答案 1 :(得分:1)
如果您template<class T> class X;
X<3>
,则T
无法工作,并推断int
为IsFunc<FunctionA>
,是吗?同样在这里IsFunc<void()>
无效,但{{1}}没问题。 HTH
答案 2 :(得分:1)
其他人已经说明了原因,但这对你有帮助吗?
#include <type_traits>
#include <typeinfo>
namespace
{
template<typename T>
bool test_if_function (T const &v)
{
return std::tr1::is_function<T>::value;
}
void functionA()
{
}
}
int main()
{
printf ("%d\r\n", test_if_function (1));
printf ("%d\r\n", test_if_function (functionA));
return 0;
}