Проверка, является ли аргумент шаблона типом класса? - PullRequest
7 голосов
/ 04 декабря 2010

Как проверить с помощью какого-либо шаблона взлома, передается ли аргумент шаблона типа класса?

Пример

int main()
{
   CheckIfClass<int>::checkConst ; No it is not of a class type
   class CLASS{};
   CheckIfClass<CLASS>::checkConst ; Yes CLASS is a class.
   CheckIfClass<std::string>::checkConst ; Yes std::string is a class
}

Ответы [ 3 ]

7 голосов
/ 04 декабря 2010

SFINAE должен делать вашу работу

#include <iostream>
template<typename T>
struct Check_If_T_Is_Class_Type
{
    template<typename C> static char func (char C::*p);
    template<typename C> static int func (...);
    enum{val = sizeof (Check_If_T_Is_Class_Type<T>::template func<T>(0)) == 1};
};
class empty{}; // Defined the class in the global namespace. 
               // You can't have local classes as template arguments in C++03

int main()
{

    std::cout<<Check_If_T_Is_Class_Type<empty>::val; // 1
    std::cout<<Check_If_T_Is_Class_Type<int>::val; // 0
    std::cout<<Check_If_T_Is_Class_Type<std::string>::val; //1
}

Выход

101
2 голосов
/ 04 декабря 2010

C ++ 0x предлагает очень простое решение:

#include <iostream>
#include <type_traits>

int main()
{
    std::cout << is_class< your_type_here >::value << std::endl;
}
1 голос
/ 04 декабря 2010

Код, который компилируется с MSVC ++ 08 ТАКЖЕ, а также с GCC, Comeau и Clang (отредактировано).

#include <iostream>
template<typename T>
struct Check_If_T_Is_Class_Type
{
    template<typename C> static char func (char C::*p);
    template<typename C> static int func (...);
    enum{val = sizeof (func<T>(0)) == 1};
};
class empty{};
int main()
{   
    std::cout<<Check_If_T_Is_Class_Type<empty>::val; // 1
    std::cout<<Check_If_T_Is_Class_Type<int>::val; // 0
    std::cout<<Check_If_T_Is_Class_Type<std::string>::val; //1
}

@ Prasoon ... не могли бы вы скомпилировать это на Comeau и Clang ... и скажите мне, скомпилировано это или нет? спасибо!

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