Ich habe einige Artikel über SFINAE gelesen, kann aber keine Lösung für meinen Fall finden. Hier ist, was ich tun möchte:Wie benutzt man SFINAE um zwei verschiedene Implementierungen derselben Methode zu erstellen
#include <type_traits>
struct CByteArray {};
struct HLVariant {
HLVariant() {}
HLVariant(const HLVariant&) {}
HLVariant(const CByteArray&) {}
};
template <typename T>
struct Serializer
{
static inline typename std::enable_if<std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
static_assert(std::is_pod<T>::value, "Not a POD type");
return CByteArray();
}
static inline typename std::enable_if<!std::is_pod<T>::value, CByteArray>::type serialize(const T& value)
{
return Serializer<HLVariant>::serialize(HLVariant(value));
}
};
template <>
struct Serializer<HLVariant>
{
static inline CByteArray serialize(const HLVariant& value)
{
return CByteArray();
}
};
int main()
{
int i = 0;
Serializer<int>::serialize(i);
Serializer<CByteArray>::serialize(CByteArray());
Serializer<HLVariant>::serialize(HLVariant());
return 0;
}
Aber natürlich, ich bin immer error C2039: 'type' : is not a member of 'std::enable_if<false,CByteArray>'
Wie zu erreichen, was ich will?
auch sein, wäre es möglich, die Serializer
irgendwie neu zu organisieren, so dass die Template-Parameter implizit abgeleitet werden können - Serializer::serialize(i);
statt Serializer<int>::serialize(i);
?
@Nawaz Abstimmung, um Ihre Antwort wiederherzustellen, da es viel bessere Alternative zu dem Problem vorschlagen. –
@ Nawaz: gleich. Ich habe meinen Code bereits mit diesem Ansatz kompiliert und getestet. Hab auch eine Frage dazu. –