联合体可以使用模板吗?

29

似乎在C++11中可以将联合定义为模板,在std::optional的参考实现中就有使用。

在C++11之前是否也可以这样做?


3
std::optional 已经不存在了 :-( - Kerrek SB
将init标志放在类的顶部而不是数据成员处是一个奇怪的决定。我认为比起有效性检查,廉价的解引用更加可取。 - Kerrek SB
@KerrekSB 对于std::optional来说,这很令人遗憾:(。至于实现的问题,甚至boost::optional implementation也是将其布尔值放在数据之前。 - Drax
@KerrekSB 为什么 std::optional 不在那里了?原因是什么? - Koushik Shetty
@Koushik:不知道。我猜委员会觉得对此缺乏经验。 - Kerrek SB
1
要明确的是,std::optional 自 C++17 起就已经存在了。 - xcvii
3个回答

30

是的,似乎一直允许这样做。一个union是一个类,而模板则是函数或类模板。

标准的相关部分:

  • [temp]

    在template-declaration中的声明应该

    — 声明或定义一个函数或类[...]。

  • [class]

    union是使用类关键字union定义的类

(因此,有人可能会认为新的类型特征std::is_class是一个轻微的误称;特征应分割类型空间,因此is_union是一个单独的、互斥的特征。)


3
我甚至不知道"联合体是一个类"!很高兴我问出了这个问题 :) - Drax

27

是的,一个特别有用的应用程序是将类型同时表示为字节数组:

template <typename T>
union test
{
    unsigned char ch[sizeof(T)];
    T variable;
};

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接