如何使用SFINAE创建同一方法的2个不同实现

紫罗兰色长颈鹿

我已经阅读了一些关于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某种方式重新组织,以便可以隐式推导template参数-Serializer::serialize(i);而不是Serializer<int>::serialize(i);

沃尔特

为了使用std::enable_if<condition>,您必须在条件模板中。一种选择是使用默认参数将函数声明为模板

template <typename T>
struct Serializer
{
    template<bool pod = std::is_pod<T>::value>  // template over condition
    static typename std::enable_if<pod, CByteArray>::type
    serialize(const T& value)
    { return CByteArray(); }

    template<bool pod = std::is_pod<T>::value>
    static typename std::enable_if<!pod, CByteArray>::type 
    serialize(const T& value)
    { return Serializer<HLVariant>::serialize(HLVariant(value)); }
};

template<>
struct Serializer<HLVariant>
{
    static CByteArray serialize(const HLVariant&);
};

或者,您可以直接在类模板的范围内应用SFINAE:

template<typename T, typename = void> struct Serializer;

template<>
struct Serializer<HLVariant>
{
    static CByteArray serialize(const HLVariant&)
    { return CByteArray(); }
};

template<typename T>
struct Serializer<T,typename std::enable_if<is_pod<T>::type>
{
    static CByteArray serialize(const T&)
    { return CByteArray(); }
};

template<typename T>
struct Serializer<T,typename std::enable_if<!is_pod<T>::type>
{
    static CByteArray serialize(const T&value)
    { return Serializer<HLVariant>::serialize(HLVariant(value));
};

或者,您可以摆脱类Serializer并直接通过模板函数进行声明:

inline CByteArray
serialize(const HLVariant&)
{ return CByteArray(); }

template<typename T>
inline typename enable_if<std::is_pod<T>::value, CByteArray>::type
serialize(const T&)
{ return CByteArray(); }

template<typename T>
inline typename enable_if<!std::is_pod<T>::value, CByteArray>::type
serialize(const T&value)
{ return serialize(HLVariant(value)); }

顺便说一句,C ++ 14定义了非常有用的别名

template<bool C, typename T>
using enable_if_t = typename enable_if<C,T>::type;

但是您当然也可以这样做。这就避免了繁琐typename::type所有的时间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以在同一方法中同时使用GET和POST?

来自分类Dev

在Quickbook PHP API中,如何使用enqueue()将对同一方法的多个调用排队

来自分类Dev

使用单一方法返回不同类型的数据

来自分类Dev

如何忽略Rspec中对具有不同参数的同一方法的某些调用?

来自分类Dev

使用minitest在模拟上多次调用同一方法

来自分类Dev

Java:如何将两个事件放在同一方法中

来自分类Dev

多个客户端在同一方法中都需要一些不同的功能

来自分类Dev

如何在另一方法中使用数组中的字符串?

来自分类Dev

茉莉花SpyOn多次使用同一方法

来自分类Dev

是否可以在同一方法中将对象转换为2个不同的事物?

来自分类Dev

在同一方法中使用多个等待的效果?

来自分类Dev

如何使用linq在单一方法中使聚合函数?

来自分类Dev

如何使用NSubstitute模拟对同一方法的调用序列以在AutoFixture中返回不同的值?

来自分类Dev

使用遮罩合并图像的单一方法

来自分类Dev

如何通过同一方法多次从父组件刷新子组件?

来自分类Dev

使用CVPixelBuffer是创建CAMetalTexture(MTLTexture)的唯一方法吗?

来自分类Dev

是否可以在同一方法中同时使用GET和POST?

来自分类Dev

在Quickbook PHP API中,如何使用enqueue()将对同一方法的多个调用排队

来自分类Dev

如何在同一方法中发送块

来自分类Dev

如何在同一方法中动态传递调用方法的名称作为参数?

来自分类Dev

如何使用Java在同一方法中使用不同的字符串值更新变量?

来自分类Dev

同一方法中的两个查询

来自分类Dev

在多次需要使用不同返回类型的情况下,两次编写同一方法的最佳实践是最好的做法吗?

来自分类Dev

如何使用NSubstitute模拟对同一方法的调用序列以在AutoFixture中返回不同的值?

来自分类Dev

上下文菜单和键盘快捷键在同一方法上返回不同的结果

来自分类Dev

一次调用同一方法多次

来自分类Dev

如何通过单一方法从不同索引中删除数组中的元素?

来自分类Dev

单一方法类与接口实现

来自分类Dev

如何对具有不同参数类型的同一方法的 2 个连续调用进行单元测试

Related 相关文章

  1. 1

    是否可以在同一方法中同时使用GET和POST?

  2. 2

    在Quickbook PHP API中,如何使用enqueue()将对同一方法的多个调用排队

  3. 3

    使用单一方法返回不同类型的数据

  4. 4

    如何忽略Rspec中对具有不同参数的同一方法的某些调用?

  5. 5

    使用minitest在模拟上多次调用同一方法

  6. 6

    Java:如何将两个事件放在同一方法中

  7. 7

    多个客户端在同一方法中都需要一些不同的功能

  8. 8

    如何在另一方法中使用数组中的字符串?

  9. 9

    茉莉花SpyOn多次使用同一方法

  10. 10

    是否可以在同一方法中将对象转换为2个不同的事物?

  11. 11

    在同一方法中使用多个等待的效果?

  12. 12

    如何使用linq在单一方法中使聚合函数?

  13. 13

    如何使用NSubstitute模拟对同一方法的调用序列以在AutoFixture中返回不同的值?

  14. 14

    使用遮罩合并图像的单一方法

  15. 15

    如何通过同一方法多次从父组件刷新子组件?

  16. 16

    使用CVPixelBuffer是创建CAMetalTexture(MTLTexture)的唯一方法吗?

  17. 17

    是否可以在同一方法中同时使用GET和POST?

  18. 18

    在Quickbook PHP API中,如何使用enqueue()将对同一方法的多个调用排队

  19. 19

    如何在同一方法中发送块

  20. 20

    如何在同一方法中动态传递调用方法的名称作为参数?

  21. 21

    如何使用Java在同一方法中使用不同的字符串值更新变量?

  22. 22

    同一方法中的两个查询

  23. 23

    在多次需要使用不同返回类型的情况下,两次编写同一方法的最佳实践是最好的做法吗?

  24. 24

    如何使用NSubstitute模拟对同一方法的调用序列以在AutoFixture中返回不同的值?

  25. 25

    上下文菜单和键盘快捷键在同一方法上返回不同的结果

  26. 26

    一次调用同一方法多次

  27. 27

    如何通过单一方法从不同索引中删除数组中的元素?

  28. 28

    单一方法类与接口实现

  29. 29

    如何对具有不同参数类型的同一方法的 2 个连续调用进行单元测试

热门标签

归档