c++初始化列表
C++ Initializer lists
我必须用类型为struct MHD_OptionItem
的元素填充std::vector
。这个结构有这样的实现:
struct MHD_OptionItem
{
enum MHD_OPTION option;
intptr_t value;
void *ptr_value;
};
我已经试过了:
vector<struct MHD_OptionItem> iov;
if(...)
iov.push_back({ MHD_OPTION_NOTIFY_COMPLETED, requestCompleted, NULL });
if(...)
iov.push_back({ MHD_OPTION_CONNECTION_TIMEOUT, connectionTimeout });
[....]
但是g++编译器告诉我:
warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x
我知道我可以初始化一个临时结构体,然后把它传递给vector,但是这种方法在我看来效率很低,而且不那么优雅。
我不能改变结构插入构造函数,因为这不是我的代码,而是一个包含的库。
有一个优雅的方法来做到这一点,而不使用c++语法吗?假设您无法更改struct
或希望将其保留为POD:
void f()
{
struct {
MHD_OptionItem operator ()(enum MHD_OPTION opt, intptr_t val, void *ptr = 0) {
MHD_OptionItem x = {opt, val, ptr};
return x;
}
} gen;
vector<struct MHD_OptionItem> iov;
if(...)
iov.push_back(gen(MHD_OPTION_NOTIFY_COMPLETED, requestCompleted, NULL));
if(...)
iov.push_back(gen(MHD_OPTION_CONNECTION_TIMEOUT, connectionTimeout));
[....]
}
另一个解决方案:
struct Gen : MHD_OptionItem {
Gen(enum MHD_OPTION opt, intptr_t val, void *ptr = 0) {
option = opt;
value = val;
ptr_value ptr;
}
};
vector<struct MHD_OptionItem> iov;
if(...)
iov.push_back(Gen(MHD_OPTION_NOTIFY_COMPLETED, requestCompleted, NULL));
if(...)
iov.push_back(Gen(MHD_OPTION_CONNECTION_TIMEOUT, connectionTimeout));
[....]
您必须为您的结构创建一个构造函数。
struct MHD_OptionItem
{
MHD_OptionItem(enum MHD_OPTION _option, intptr_t _value, void *_ptr_value)
: option(_option), value(_value), ptr_value(_ptr_value) {}
enum MHD_OPTION option;
intptr_t value;
void *ptr_value;
};
那么你可以这样初始化:
ov.push_back(MHD_OptionItem(MHD_OPTION_NOTIFY_COMPLETED, requestCompleted, NULL));
如何引入构造函数和复制构造函数,
struct MHD_OptionItem
{
//...
MHD_OptionItem(MHD_OPTION, intptr_t, void*); // makes struct a non-POD
MHD_OptionItem(const MHD_OptionItem&) // copy constructor
};
并将其用于初始化,
iov.push_back(MHD_OptionItem(MHD_OPTION_NOTIFY_COMPLETED, requestCompleted, NULL));
是的,你在介绍一个临时的。但是语法仍然很优雅
也许你可以提供一个包含所有3个参数的构造函数,然后按如下方式创建它:
iov.push_back(MHD_OptionItem( MHD_OPTION_NOTIFY_COMPLETED, requestCompleted, NULL));
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- C++11 中的混合列表初始化
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++20 从括号中的值列表初始化聚合,不支持内部数组
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 默认参数和空列表初始化
- 如何在列表初始化中放置额外的语句?
- C++列表初始化允许多个用户定义的转换
- 列表初始化是否将原子初始化为零
- 使用可变模板列表初始化数组,并放置new
- 使用整数初始化列表初始化长双精度的向量
- 直接列表初始化的自动规则
- 使用初始化列表初始化unique_ptr的容器,继续
- 如何修复"非聚合无法使用初始值设定项列表初始化" <map>
- 直接列表初始化和复制列表初始化之间的差异
- 为什么我可以在不使用赋值运算符的情况下使用列表初始化普通数组
- C++ - 使用类中的初始值设定项列表初始化动态集