IsAbstract Vorlage und Visual Studio
-
03-07-2019 - |
Frage
Die folgende Vorlage wird entscheiden, ob T-Zusammenfassung mit 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) };
};
Zum Beispiel: struct MyClass2 {virtual void f () {}}; struct MyClass1 {virtual void f () = 0; };
bool twoAbstract = isAbstract<myClass2>::result;
bool oneAbstract = isAbstract<myClass1>::result;
Es ist jedoch nicht in Visual Studio 9.0 mit dem Fehler:
error C2784: 'AiLive::isAbstract<T>::No AiLive::isAbstract<T>::test(U (*)[1])' : could not deduce template argument for 'U (*)[1]' from 'myClass2'
Hat jemand eine Idee, was das Problem ist und wie dieses Problem beheben?
MSDN Berichte, dass sie jetzt eine is_abstract
Klasse seit VS2008 als Teil TR1 (innerhalb des Headers type_traits
). Allerdings scheint es aus meiner Installation zu fehlen.
PS. Aus Gründen, die lang und langweilig sind, kann ich dies nicht über Boost-reimplementieren.
Update
Auch versuchte zu ersetzen,
template<class U> static No test( U (*)[1] );
mit jedem,
template<class U> static No test( U (*x)[1] );
template<class U> static No test( U (*)() );
template<class U> static No test( U (*x)() );
und
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 );
und
// Match if I can make a U2
template <typename U> static No test( U2<T> x );
Kein Glück - alle sagen, dass Template-Argument kann nicht für U abgeleitet werden
.Lösung
Dies funktioniert für mich in 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) };
};
Hinweis Ich hatte gerade isAbstract<T>::
aus dem Aufruf zu entfernen, um test
.
Andere Tipps
Nicht sicher, wie ich habe zur Kenntnis getan C ++ für eine Weile, aber können Sie
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;