Обнаружение, является ли тип функцией - PullRequest
1 голос
/ 10 октября 2010
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)};
};

И если я пытаюсь запустить его в основном:

void functionA();
    int _tmain(int argc, _TCHAR* argv[])
    {
        int a = 0;
        cout << IsFunc<functionA>::value;//<=--------HERE

        return 0;
    }

Я получаю сообщение об ошибке:
Ошибка 1 Ошибка C2923: 'IsFunc': 'functionA'недопустимый тип шаблона
Что я делаю не так?
Спасибо

Ответы [ 3 ]

3 голосов
/ 10 октября 2010

functionA является функцией, а не типом, поэтому он не может быть допустимым параметром шаблона для IsFunc, который ожидает тип.

Если вам нужен шаблон для определения, является ли тип типом функции, то уже есть boost::is_function (который является частью TR1 / C ++ 0x).

1 голос
/ 10 октября 2010

Другие уже указали причину, но поможет ли это вам?

#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;
}
1 голос
/ 10 октября 2010

Если у вас template<class T> class X;, вы не ожидаете, что X<3> сработает, и выведите, что T равно int, не так ли? То же самое здесь IsFunc<FunctionA> недействительно, но IsFunc<void()> в порядке. НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...