【发布时间】:2018-02-21 22:17:57
【问题描述】:
我想编写方便的颜色管理类,这将允许我使用不同的组件顺序和基本上不同的设置。我希望它在编译时是可区分的。 假设我有这个代码:
template <typename _valueType>
struct RGBAColorData {
using ValueType = _valueType;
union {
struct { ValueType r, g, b, a; };
ValueType components[4];
};
};
这个(即使匿名结构是非标准的)工作正常,当我想这样使用它时:
RGBAColorData color;
color.r = whatever;
但是,这不是我的代码的最终形式。我希望它有“拥有”类模板,它会在编译时在XYZColorData 之间进行选择。假设它看起来像这样:
template <typename _valueType, template <typename> _dataScheme>
struct Color
{
using ValueType = _valueType;
using DataScheme = _dataScheme<ValueType>;
// what now?
// DataScheme data; // ???
};
这会产生问题,因为我希望我的代码可以这样使用:
using RGBAColorF = Color<float, RGBAColorData>;
RGBAColorF brushColor;
brushColor.r = whatever;
这将是使用颜色的一种非常方便的方式,但是我想不出任何解决此问题的方法。 最后,也许我对此有错误的方法,也许这可以用更少的努力来完成,但是我想不出任何其他不涉及大量模板类专业化的方法。
【问题讨论】:
-
你需要继承。
-
不幸的是,您的“工作正常”代码具有未定义的行为,我几乎可以肯定您打算使用它。
-
@Walter:与其说是严格的别名规则,不如说是“从非活动的联合成员中读取”规则。相关:stackoverflow.com/q/36051084/103167
-
这里有两个问题。您问的那个,我将其解释为“如何重用变体成员的集合?”,有一个简单的答案:使用继承。在 cmets 中提出的问题是,“当我使用联合在数组顶部覆盖具有多个相同类型元素的结构时,我可以互换使用结构成员名称和数组索引吗?”有一个更复杂的答案:不,在你看来它可能有效,但它并不安全。