装箱和拆箱的C ++类

用户名

我想有一个类Boxed_value可以InBox其他类型(从开始intdoublestring...),类似于objectC#该类类型可以进一步传递给Unbox它所使用的函数这些功能将获得参考:

void receiver( Boxed_value & bv ) {}

因此,它不应该是模板。要么?我需要一个配方...该UnBox功能可以单独设置并进行模板化。在这种情况下receiver可以获得2个参数:

void receiver( Boxed_value & bv, Engine & eng ) {}

下面的实现是虚拟的,尚未编译。

struct Boxed_value {
    void inbox(int v) { _iv = v; }
    void inbox(double v) { _dv = v; }
    void inbox(std::string & v) { _sv = v; }

    int _iv;
    double _dv;
    std::string _sv;
};

struct Engine {
    template<typename T>
    T unbox(Boxed_value bv) { 
        if (std::is_same<T, typeid(bv._iv).name()>::value) { return _iv };
        if (std::is_same<T, typeid(bv._dv).name()>::value) { return _dv };
        if (std::is_same<T, typeid(bv._sv).name()>::value) { return _sv };
    }
};
songyuanyao
  1. 注意,在编译时,每个if子句都必须实例化。这意味着您将在function中返回不同的类型unbox

  2. 您应该比较成员的类型std::is_same,但不能比较typeid(bv._iv).name(),它不是type而是具有type的对象const char*

您可以应用Constexpr If(自C ++ 17起)。

如果值为true,则丢弃statement-false(如果存在),否则,丢弃statement-true。

并使用decltype(自C ++ 11起)获取成员的类型。

例如

template<typename T>
T unbox(const Boxed_value& bv) { 
    if constexpr (std::is_same<T, decltype(bv._iv)>::value) { return bv._iv };
    else if constexpr (std::is_same<T, decltype(bv._dv)>::value) { return bv._dv };
    else if constexpr (std::is_same<T, decltype(bv._sv)>::value) { return bv._sv };
}

在C ++ 17之前,您可以应用完全专业化

template<typename T>
T unbox(const Boxed_value& bv);

template<>
decltype(Boxed_value::_iv) unbox<decltype(Boxed_value::_iv)> (const Boxed_value& bv) { return bv._iv; }
template<>
decltype(Boxed_value::_dv) unbox<decltype(Boxed_value::_dv)> (const Boxed_value& bv) { return bv._dv; }
template<>
decltype(Boxed_value::_sv) unbox<decltype(Boxed_value::_sv)> (const Boxed_value& bv) { return bv._sv; }

PS:我将参数类型从更改Boxed_valueconst Boxed_value&,以避免不必要的复制。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

转换为基类是否涉及装箱和拆箱

来自分类Dev

与通用类型和装箱/拆箱交互

来自分类Dev

C#中的装箱/拆箱

来自分类Dev

为什么我们需要在C#中装箱和拆箱?

来自分类Dev

LambdaMetaFactory 装箱/拆箱参数和返回类型

来自分类Java

Java·带lambda的装箱和拆箱原始矩阵

来自分类Dev

scala Option [Int]基本装箱和拆箱

来自分类Java

自动装箱和拆箱在Java和C#中的行为是否有所不同

来自分类Java

当将==用于基本值和装箱值时,自动装箱完成还是拆箱完成

来自分类Java

谁将进行自动装箱/拆箱?

来自分类Java

java自动装箱/拆箱如何工作?

来自分类Dev

CIL-装箱/拆箱与可为空

来自分类Java

Java自动装箱/拆箱工作

来自分类Dev

装箱值被拆箱,然后立即重新装箱

来自分类Java

装箱价值拆箱然后重新装箱

来自分类Dev

为什么整数自动装箱和拆箱对Java中的Arrays.asList不起作用?

来自分类Dev

打印 int 值数组时,流是否使用装箱和拆箱

来自分类Java

为什么我们在Java中使用自动装箱和拆箱?

来自分类Java

为什么有些语言需要装箱和拆箱?

来自分类Java

整数自动拆箱和自动装箱会带来性能问题吗?

来自分类Dev

可以在C#中对结构进行装箱/拆箱是否具有与原子相同的效果?

来自分类Dev

装箱/拆箱,更改装箱值的参考副本不会更改为装箱值

来自分类Dev

在装箱和拆箱操作中将预定义变量的值分配给对象类型变量

来自分类Java

为什么自动装箱/拆箱在这里失败?

来自分类Dev

通过参考/值传递-装箱/拆箱关系

来自分类Dev

C#概念拆箱

来自分类Dev

装箱/拆箱成本以及装箱对象在写入时是否有副本?

来自分类Dev

C#装箱/包装-自定义类充当整数

来自分类Python

充当**拆包映射的类

Related 相关文章

  1. 1

    转换为基类是否涉及装箱和拆箱

  2. 2

    与通用类型和装箱/拆箱交互

  3. 3

    C#中的装箱/拆箱

  4. 4

    为什么我们需要在C#中装箱和拆箱?

  5. 5

    LambdaMetaFactory 装箱/拆箱参数和返回类型

  6. 6

    Java·带lambda的装箱和拆箱原始矩阵

  7. 7

    scala Option [Int]基本装箱和拆箱

  8. 8

    自动装箱和拆箱在Java和C#中的行为是否有所不同

  9. 9

    当将==用于基本值和装箱值时,自动装箱完成还是拆箱完成

  10. 10

    谁将进行自动装箱/拆箱?

  11. 11

    java自动装箱/拆箱如何工作?

  12. 12

    CIL-装箱/拆箱与可为空

  13. 13

    Java自动装箱/拆箱工作

  14. 14

    装箱值被拆箱,然后立即重新装箱

  15. 15

    装箱价值拆箱然后重新装箱

  16. 16

    为什么整数自动装箱和拆箱对Java中的Arrays.asList不起作用?

  17. 17

    打印 int 值数组时,流是否使用装箱和拆箱

  18. 18

    为什么我们在Java中使用自动装箱和拆箱?

  19. 19

    为什么有些语言需要装箱和拆箱?

  20. 20

    整数自动拆箱和自动装箱会带来性能问题吗?

  21. 21

    可以在C#中对结构进行装箱/拆箱是否具有与原子相同的效果?

  22. 22

    装箱/拆箱,更改装箱值的参考副本不会更改为装箱值

  23. 23

    在装箱和拆箱操作中将预定义变量的值分配给对象类型变量

  24. 24

    为什么自动装箱/拆箱在这里失败?

  25. 25

    通过参考/值传递-装箱/拆箱关系

  26. 26

    C#概念拆箱

  27. 27

    装箱/拆箱成本以及装箱对象在写入时是否有副本?

  28. 28

    C#装箱/包装-自定义类充当整数

  29. 29

    充当**拆包映射的类

热门标签

归档