【发布时间】:2014-11-04 10:20:02
【问题描述】:
我已阅读有关 SFINAE 的一些文章,但找不到适合我的情况的解决方案。这是我想做的:
#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;
}
当然,我收到的是error C2039: 'type' : is not a member of 'std::enable_if<false,CByteArray>'
如何实现我想要的?
另外,是否有可能以某种方式重新组织Serializer,以便可以隐式推导出模板参数-Serializer::serialize(i); 而不是Serializer<int>::serialize(i);?
【问题讨论】:
-
@Nawaz 投票取消删除您的答案,因为它提出了更好的问题替代方案。
标签: c++ templates c++11 sfinae