将不同类型的向量作为初始值设定项列表传递给函数
Passing a vector with different types as initializer list to function
我有这个无工作代码,它应该演示我想要实现的目标:
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 }
}
);
}
我想要实现的目标:
MyClass::foo
需要一个std::vector<Member>
作为参数。- 此向量应直接从初始值设定项列表传递。
Member
的第二个参数可以有不同的类型,这里用union Parameter
表示。- 如何在
MyClass::foo
中检测已传递哪些类型? 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
。它可以转换为double
和unsigned int
,编译器将无法确定您想要哪一个。您可以将32767u
编写为具有类型unsigned int
的常量。(我假设这就是你的uint
的typedef
如何在
MyClass::foo
中检测已传递哪些类型?
最好的方法取决于你这样做的原因。如果要根据所保存的值执行不同的代码,请使用visit
。如果只想有条件地执行一种类型的代码,请使用get_if
。如果您只想检查,但不对值本身执行任何操作,请使用index
或holds_alternative
。
相关文章:
- 一对向量构造函数:初始值设定项列表与显式构造
- C++:如何使函数只返回作为列表一部分的字符串
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 运行相同函数名称C++的多个类的列表
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C++模板函数中的初始化 - 新的初始值设定项表达式列表被视为复合表达式
- std::vector 没有重载函数的实例与参数列表匹配
- 从封装在对象中的函数 C++ 返回时为空的列表
- 构造函数/函数声明参数列表中的统一初始化
- C++:继承和列表函数作为类成员的问题
- 我一直在尝试递归中编写一个分类的链接列表函数
- C++列表函数返回列表
- 列表函数未按预期工作
- C++链表/多态性未运行列表函数
- 这是一个具有基于数组的列表函数的数据结构项目,我似乎无法摆脱这个无限循环。
- 多集作为类模板,使用列表函数作为基础
- Boost::mpl类型列表函数应用程序
- 这个变量参数列表函数调用是如何工作的
- C++STL列表函数使用空列表分段
- STL 列表数组无法访问列表函数