C++ 如何使其中一个元素为并集,从而生成\对或\元组?

C++ 如何使其中一个元素为并集,从而生成\对或\元组?,c++,c++11,stl,C++,C++11,Stl,我有一份工会宣言,很简单: union VariableType { bool Bool; int64_t Int; double Double; std::string* String; }; 在我的头文件中,我在一些复杂的数据类型中使用此联合,如下所示: extern std::map<std::string, std::tuple<uint8_t, VariableType, VariableType>> PredefinedVar

我有一份工会宣言,很简单:

union VariableType
{
    bool Bool;
    int64_t Int;
    double Double;
    std::string* String;
};
在我的头文件中,我在一些复杂的数据类型中使用此联合,如下所示:

extern std::map<std::string, std::tuple<uint8_t, VariableType, VariableType>> PredefinedVariables;
extern std::map<std::string, std::pair<uint8_t, VariableType>> UserVariables;
extern std::map预定义变量;
extern std::映射用户变量;
在cpp文件中,我尝试使用大括号初始化来初始化贴图,如下所示:

std::map<std::string, std::tuple<uint8_t, VariableType, VariableType>> PredefinedVariables
{
    {"num_threads", std::make_tuple(1, {.Int = 1}, {.Int = 1})},
    {"commands_logging", std::make_tuple(0, {.Bool = false}, {.Bool = false})}
};
std::映射预定义变量
{
{“num_threads”,std::make_tuple(1,{.Int=1},{.Int=1}),
{“命令日志”,std::生成(0,{.Bool=false},{.Bool=false})
};
我得到以下错误:

error: too many arguments to function ‘constexpr std::tuple<typename std::__decay_and_strip<_Elements>::__type ...> std::make_tuple(_Elements&& ...)
[with _Elements = {}]’
         {"num_threads", std::make_tuple(1, {.Int = 1}, {.Int = 1})},
错误:函数'constepr std::tuple std::make_tuple(_Elements&&…)的参数太多
[带_元素={}]
{“num_threads”,std::make_tuple(1,{.Int=1},{.Int=1}),
我试图缩小它的范围,所以我测试了使用大括号初始化初始化一个简单类型的map
std::map
,效果很好。我还尝试只初始化一个元组或一对联合类型,但不起作用:

std::pair<uint8_t, VariableType> Tmp = std::make_pair(5, {.Int = 4});

error: no matching function for call to ‘make_pair(int, <brace-enclosed initializer list>)’
         std::pair<uint8_t, VariableType> Tmp = std::make_pair(5, {.Int = 4});
std::pair Tmp=std::make_pair(5,{.Int=4});
错误:调用“make_pair(int,)”时没有匹配函数
std::pair Tmp=std::make_pair(5,{.Int=4});
我也尝试过用同样的方法初始化工会,没有抱怨

那么,为什么在
std::make_pair
std::make_tuple
内部的联合初始化是非法的,但在其他地方是合法的呢?我该如何解决这个问题


我正在使用g++版本6.2.0和UbuntuGlibc2.24-3ubuntu2

我跟随了@PasserBy的评论。我刚刚添加了union构造函数,并使用它们来赋值,而不是大括号初始化


工作起来很有魅力。

{.Int=1}是C语法。它在C++中没有作用。@ DietrichEpp,如果你不介意我问,如果它在C++中不工作,那么当我初始化Unple和Pube之外的联合变量时,它是如何工作的?编译器允许它作为扩展。但是,它不是有效的C++。我想这个问题是在几天前出现的。只需给你的工会构造函数和done@PasserBy我试过了,效果不错。你能把这个作为回答吗?