将不同类型的向量作为初始值设定项列表传递给函数

Passing a vector with different types as initializer list to function

本文关键字:列表 函数 同类型 向量      更新时间:2023-10-16

我有这个无工作代码,它应该演示我想要实现的目标:

class Member
{
const char * someText;
union Parameter
{
const char * ptrParameter;
double       doubleParameter;
uint         uintParameter;
};
};
class MyClass
{
auto foo( std::vector<Member> & ) -> void;
};
int main()
{
MyClass instance;
instance.foo( 
{
{ "SomeText", "TextParameter" },
{ "SomeDouble", 3.14159 },
{ "SomeUint",   32767 }
}
);
}

我想要实现的目标:

  1. MyClass::foo需要一个std::vector<Member>作为参数。
  2. 此向量应直接从初始值设定项列表传递。
  3. Member的第二个参数可以有不同的类型,这里用union Parameter表示。
  4. 如何在MyClass::foo中检测已传递哪些类型?
  5. union Parameter中的类型只能是上述这 3 种。

我尝试了很多,但由于我是一个C++初学者,所以我没有成功。


我正在使用 C++17 - 提升不是一种选择。如何实现这一点?

你可以非常接近std::variant

class Member
{
const char * someText;
std::variant<const char *, double, unsigned int> parameter;
};

但是,您需要进行一些其他更改才能允许所需的初始化类型:

  • 需要public字段以允许聚合初始化(编译器从{ a, b }内置初始化),但默认情况下class类型具有private字段。在这种情况下,我会将class更改为struct

  • auto foo( std::vector<Member> & ) -> void通过左值引用std::vector<Member>,但您希望允许使用临时向量调用它。在这种情况下,我不会使用引用。我会按价值std::vector<Member>

  • { "SomeUint", 32767 }将不是有效的初始化器,因为32767的类型为signed int。它可以转换为doubleunsigned int,编译器将无法确定您想要哪一个。您可以将32767u编写为具有类型unsigned int的常量。(我假设这就是你的uint的typedef

如何在MyClass::foo中检测已传递哪些类型?

最好的方法取决于你这样做的原因。如果要根据所保存的值执行不同的代码,请使用visit。如果只想有条件地执行一种类型的代码,请使用get_if。如果您只想检查,但不对值本身执行任何操作,请使用indexholds_alternative