Sì, è ... ma probabilmente non funzionerà come ti aspetti.
template < typename T >
void foo()
{
if (is_same<T,SomeClass>::value) ...;
else if (is_same<T,SomeClass2>::value) ...;
}
È possibile ottenere is_same
da std::
o boost::
a seconda del vostro desiderio/compilatore. Il primo è solo in C++ 0x.
Il problema si presenta con ciò che è in ...
. Se ti aspetti di essere in grado di fare una chiamata di funzione specifica a quei tipi in foo, ti stai sbagliando tristemente. Si verificherà un errore del compilatore anche se quella sezione di codice non viene mai eseguita quando si passa a qualcosa che non obbedisce all'interfaccia prevista.
Per risolvere QUEL problema è necessario fare qualcosa di leggermente diverso. Mi consiglia di dispacciamento tag:
struct v1_tag {};
struct v2_tag {};
template < typename T > struct someclass_version_tag;
template < > struct someclass_version_tag<SomeClass> { typedef v1_tag type; };
template < > struct someclass_version_tag<SomeClass2> { typedef v2_tag type; };
void foo(v1_tag) { ... }
void foo(v2_tag) { ... }
template < typename T > void foo()
{
typedef typename someclass_version_tag<T>::type tag;
foo(tag());
}
Nota che non sarà essere affetti alcun overhead runtime-polimorfismo qui e con le ottimizzazioni attivate esso dovrebbe comportare lo stesso o addirittura più piccola dimensione del codice e la velocità (anche se si shouldn' t preoccupiamoci comunque fino a quando non avrai eseguito un profiler).
fonte
2010-12-23 21:01:01
È possibile restituire diversi tipi basati su version_tag? – Boying
Sicuro. Devi trovare un modo per interrogare le informazioni se sei bloccato in C++ 03, o usare auto in C++ 11 e versioni successive. Finché non provi a restituire diversi tipi all'interno della stessa istanza, non avrai alcun problema. –
ora con C++ 17, è possibile utilizzare le istruzioni di constexpr if per farlo banalmente – xaxxon