检测类型是否为函数

时间:2010-10-10 12:12:02

标签: c++ templates

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'不是有效的模板类型
我做错了什么?
感谢

3 个答案:

答案 0 :(得分:3)

functionA是一个函数,而不是一个类型,因此它不能成为期望类型的IsFunc的有效模板参数。

如果需要模板来检测类型是否是函数类型,则已经boost::is_function(它是TR1 / C ++ 0x的一部分)。

答案 1 :(得分:1)

如果您template<class T> class X; X<3>,则T无法工作,并推断intIsFunc<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;
}