Шаблон isAbstract и визуальная студия
-
03-07-2019 - |
Вопрос
Следующий шаблон определит, является ли 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 {виртуальная пустота f() {}};struct myClass1 {виртуальная пустота 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
).Однако, похоже, он отсутствует в моей установке.
ПС.По долгим и скучным причинам я не могу реализовать это через 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.
Решение
Это работает для меня в 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
.
Другие советы
Не уверен, поскольку я уже некоторое время работал с 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;