2011-08-18 123 views
4

我必须用struct MHD_OptionItem类型的元素填充std::vector。 这个结构有这样实现:C++初始化程序列表

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语法?

回答

6

假如你不能改变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)); 
    [....] 
+0

实际上,您正在制作1份额外的'MHD_OptionItem'副本。 – iammilind

+0

@iammilind:那又如何?对于RVO来说,这是一个简单的例子。 – ybungalobill

+1

仿函数是什么,为什么不使用普通函数呢? –

0

你必须为你的结构创建一个构造函数。

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)); 
+0

的结构是不是在我的代码。这是一个图书馆;我无法更改此代码 –

+0

是否MHD_OptionItem是POD对象? –

+0

@Sebastiano然后看到我的建议。 – ybungalobill

0

怎么样有一个构造函数和复制介绍构造,

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)); 

是的,你正在引入一个临时的。不过还是语法保持优雅

0

可能是你能提供一个构造函数把所有的3个参数,然后按如下方式创建它:

iov.push_back(MHD_OptionItem(MHD_OPTION_NOTIFY_COMPLETED, requestCompleted, NULL)); 
+0

噢......一分钟内答案如此之多:) – mukeshkumar