C++11 使用默认构造函数初始化结构的公共成员

C++11 使用默认构造函数初始化结构的公共成员,c++11,initialization,C++11,Initialization,给定一个具有如下默认构造函数的玩具struct: struct RGB { unsigned char r, g, b; RGB() :r(0), g(0), b(0) {} }; 假设我没有访问源代码的权限来添加自己的构造函数,那么如何将其初始化为特定的颜色呢 我不完全理解为什么这些不起作用: // OK, I can sort-of accept this one RGB red = {255, 0, 0}; // Not shorthand for

给定一个具有如下默认构造函数的玩具
struct

struct RGB {
    unsigned char r, g, b;

    RGB() 
        :r(0), g(0), b(0) {}
};
假设我没有访问源代码的权限来添加自己的构造函数,那么如何将其初始化为特定的颜色呢

我不完全理解为什么这些不起作用:

// OK, I can sort-of accept this one
RGB red = {255, 0, 0};

// Not shorthand for green.r=0, green.g=255, green.b=0;?
RGB green = {.r = 0, .g = 255, .b = 0};

// I seem to be missing a constructor that accepts a list?
RGB blue{0, 0, 255};
有没有其他的C++11方法可以缩短好的老式程序:

RGB yellow;
yellow.r = 255;
yellow.g = 255;
yellow.b = 0;

此外,我如何最低限度地修改
struct
声明,以支持上述任何一种,并拥有默认的初始化方法。

如果无法向结构的构造函数添加默认参数,那么助手函数如何:

RGB makeRGB(unsigned char r, unsigned char g, unsigned char b)
{
    RGB result;
    result.r = r;
    result.g = g;
    result.b = b;
    return result;
}
可以这样使用:

RGB red = makeRGB(255, 0, 0);
将处理临时问题,并提供无开销的解决方案,除非您使用的是糟糕的编译器


理想的解决方案是修改默认构造函数以采用可选参数:

struct RGB {
    unsigned char r, g, b;

    explicit RGB(unsigned char r, unsigned char g, unsigned char b) 
        :r(r), g(g), b(b) {}
    RGB() : RGB(0, 0, 0) {}
};
可以像您期望的那样使用:

RGB red(255, 0, 0);
RGB green{0, 255, 0};
RGB blue;
blue.b = 255;

.

如果无法将默认参数添加到结构的构造函数中,那么助手函数如何:

RGB makeRGB(unsigned char r, unsigned char g, unsigned char b)
{
    RGB result;
    result.r = r;
    result.g = g;
    result.b = b;
    return result;
}
可以这样使用:

RGB red = makeRGB(255, 0, 0);
将处理临时问题,并提供无开销的解决方案,除非您使用的是糟糕的编译器


理想的解决方案是修改默认构造函数以采用可选参数:

struct RGB {
    unsigned char r, g, b;

    explicit RGB(unsigned char r, unsigned char g, unsigned char b) 
        :r(r), g(g), b(b) {}
    RGB() : RGB(0, 0, 0) {}
};
可以像您期望的那样使用:

RGB red(255, 0, 0);
RGB green{0, 255, 0};
RGB blue;
blue.b = 255;
.

给定

struct color
{
color(std::initializer_list<float> list) = delete;
float r, g, b;
};
struct-color
{
颜色(标准::初始值设定项列表)=删除;
浮子r,g,b;
};
  • color c={1,2,3}
    color c{1,2,3}
    是相同的
  • 语法类似于
    color c={.r=0.g=255.b=0}是C语言的专用语言,不是C++。
    
  • color c={1,2,3}在C++11中非常好。它被称为。它甚至覆盖了
    初始值设定项列表中的显式构造函数。链接描述了如何显式删除它
  • color c({1,2,3})
  • 给定

    struct-color
    {
    颜色(标准::初始值设定项列表)=删除;
    浮子r,g,b;
    };
    
  • color c={1,2,3}
    color c{1,2,3}
    是相同的
  • 语法类似于
    color c={.r=0.g=255.b=0}是C语言的专用语言,不是C++。
    
  • color c={1,2,3}在C++11中非常好。它被称为。它甚至覆盖了
    初始值设定项列表中的显式构造函数。链接描述了如何显式删除它
  • color c({1,2,3})

  • “理想解决方案”并不那么理想-它定义了从
    无符号字符到
    RGB
    的隐式转换。谢谢,我可能是想得太多了。我应该向生成有问题的标题的项目提交一份错误报告/更改请求,看看它们是否可以生成更易于初始化的构造函数。“理想解决方案”并不那么理想-它定义了从
    无符号字符
    RGB
    的隐式转换。谢谢,我可能是想得太多了。我应该向生成有问题的标题的项目提交一个bug报告/更改请求,看看它们是否可以使构造函数对初始化更加友好。