c++初始化列表

C++ Initializer lists

本文关键字:列表 初始化 c++      更新时间:2023-10-16

我必须用类型为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));