我必须用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
我知道我可以初始化一个临时结构,然后将它传递给向量,但这种方法在我看来效率很低,也不是很优雅。
我不能改变插入构造函数的结构,因为这不是我的代码,而是一个包含的库。
有没有一种不使用c++0x语法就能做到这一点的优雅方法?
发布于 2011-08-18 17:40:41
假设您不能更改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));
[....]发布于 2011-08-18 17:38:32
你必须为你的结构创建一个构造函数。
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));发布于 2011-08-18 17:39:53
引入一个构造函数和复制构造函数,
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));是的,您正在引入一个临时的。但是语法仍然很优雅。
https://stackoverflow.com/questions/7105284
复制相似问题