2011-08-18 178 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