c++ - 如何简化这个冗余的 C++ 代码?

标签 c++

现有的类有两个,一个是SrcField它返回具体类型值,另一个是 union DSTField ,它定义了相应的数据类型。

class SrcField
{
public:
    signed char     GetInt8();
    unsigned char   GetUInt8();
    short           GetInt16();
    unsigned short  GetUInt16();
    int             GetInt32();
    unsigned int    GetUInt32();
    float           GetFloat();
    double          GetDouble();
    bool            GetBool();
    DataType        GetType();
private:
    DataType m_type;
    DSTField m_data;
};

union DSTField
{
    signed char    m_int8;
    unsigned char  m_uint8;
    short          m_int16;
    unsigned short m_uint16;
    int            m_int32;
    unsigned int   m_uint32;
    float          m_float;
    double         m_double;
    bool           m_bool;
};

当我使用这两个类时,应用程序如下。 这是非常多余的;有没有什么好的简化方法,比如模板、泛型编程等?

int main()
{
    SrcField sf;
    DSTField df;

    switch(sf.GetType())
    {
    case TYPE_INT8:
        df.m_int8 = sf.GetInt8();
        break;
    case TYPE_UINT8:
        df.m_uint8 = sf.GetUInt8();
        break;
    case TYPE_INT16:
        df.m_int16 = sf.GetInt16();
        break;
    case TYPE_UINT16:
        df.m_uint16 = sf.GetUInt16();
        break;
    case TYPE_INT32:
        df.m_int32 = sf.GetInt32();
        break;
    case TYPE_UINT32:
        df.m_uint32 = sf.GetUInt32();
        break;
    case TYPE_FLOAT:
        df.m_float = sf.GetFloat();
        break;
    case TYPE_DOUBLE:
        df.m_double = sf.GetDouble();
        break;
    case TYPE_BOOL:
        df.m_bool = sf.GetBool();
        break;
    default:
        break;
    }
}

最佳答案

使用 std::variant 您的代码将如下所示:

#include <iostream>
#include <variant>

typedef std::variant<
    signed char,
    unsigned char,
    short,
    unsigned short,
    int,
    unsigned int,
    float,
    double,
    bool
> SrcField, DSTField;

int main()
{
    SrcField sf(97.0f);
    DSTField df;

    df = sf;

    if(auto pval = std::get_if<float>(&df))
      std::cout << "variant value: " << *pval << '\n'; 
    else 
      std::cout << "failed to get value!" << '\n';
}

注意:由于是 c++17,对于以前的版本,我建议使用 boost::variantboost::anyAny 类(例如我在我的项目中使用一个基于 this 的类)

关于c++ - 如何简化这个冗余的 C++ 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44196608/

相关文章:

c++ - 为什么在调用 AfxWinInit 时收到警告 C6309?

c++ - 在场景 Qt 中移动一个项目

C++ 数组衰减不会发生以供引用,为什么?

c++ - 预处理器指令在 for 循环中不起作用

c++ - 右值需要分配哪些向后兼容性?

c++ - 我如何在 C++ 中覆盖?

c++ - QGraphicsItem 和 Tab 键顺序

c++ - 使用级联相关神经网络(再训练)

c++ - 为什么 VScode 在 .h 文件中显示“"'iostream' 文件未找到”?

c++ - 在模板类中使用 "this"关键字