isAbstract шаблон и визуальная студия - PullRequest
1 голос
/ 01 мая 2009

Следующий шаблон определит, является ли T абстрактным с g ++.

/**
   isAbstract<T>::result is 1 if T is abstract, 0 if otherwise.
 */
template<typename T>
class isAbstract
{
   class No { };
   class Yes { No no[3]; }; 

   template<class U> static No test( U (*)[1] ); // not defined
   template<class U> static Yes test( ... ); // not defined 

public:
   enum { result = sizeof( isAbstract<T>::template test<T>( 0 ) ) == sizeof(Yes) }; 
};

Например: struct myClass2 {virtual void f () {}}; struct myClass1 {virtual void f () = 0; };

bool twoAbstract = isAbstract<myClass2>::result;
bool oneAbstract = isAbstract<myClass1>::result;

Однако в Visual Studio 9.0 происходит сбой с ошибкой:

error C2784: 'AiLive::isAbstract<T>::No AiLive::isAbstract<T>::test(U (*)[1])' : could not deduce template argument for 'U (*)[1]' from 'myClass2'

Кто-нибудь имеет представление о том, в чем проблема и как это исправить?

MSDN Сообщает, что теперь они имеют класс is_abstract с VS2008 как часть TR1 (внутри заголовка type_traits). Однако, это, кажется, отсутствует в моей установке.

PS. По долгим и скучным причинам я не могу переопределить это через Boost.

Обновление

Также попробовал заменить,

template<class U> static No test( U (*)[1] ); 

с каждым из,

template<class U> static No test( U (*x)[1] );
template<class U> static No test( U (*)() );
template<class U> static No test( U (*x)() );

и

template <typename U>
struct U2 : public U
{
   U2( U* ) {}
};

// Match if I can make a U2
template <typename U> static No test( U2<U> x  );

и

// Match if I can make a U2
template <typename U> static No test( U2<T> x  );

Не повезло - все говорят, что аргумент шаблона не может быть выведен для U.

Ответы [ 2 ]

1 голос
/ 02 мая 2009

Это работает для меня в VC9:

template<typename T>
class isAbstract
{
    class No { };
    class Yes { No no[3]; }; 

    template<class U> static No test( U (*)[1] ); // not defined
    template<class U> static Yes test( ... ); // not defined 

public:
    enum { result = sizeof( test<T>( 0 ) ) == sizeof(Yes) }; 
};

Обратите внимание, я просто должен был удалить isAbstract<T>:: из звонка на test.

0 голосов
/ 01 мая 2009

Не уверен, так как я заметил, что некоторое время делал C ++, но вы можете использовать

template< typename  T, typename  U>
class isAbstract
{
   class No { };
   class Yes { No no[3]; }; 

   template<class U> static No test( U (*)[1] ); // not defined
   template<class U> static Yes test( ... ); // not defined 

public:
   enum { result = sizeof( isAbstract<T>::template test<T>( 0 ) ) == sizeof(Yes) }; 
};


bool twoAbstract = isAbstract<myClass2, SomeTypeU>::result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...