首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++初始化器列表

C++初始化器列表
EN

Stack Overflow用户
提问于 2011-08-18 17:34:35
回答 4查看 1.3K关注 0票数 4

我必须用struct MHD_OptionItem类型的元素填充std::vector。这个结构有这样的实现:

代码语言:javascript
复制
struct MHD_OptionItem
{
    enum MHD_OPTION option;
    intptr_t value;
    void *ptr_value;
 };

我试过这样做:

代码语言:javascript
复制
 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语法就能做到这一点的优雅方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-18 17:40:41

假设您不能更改struct,或者您想将其保留为POD:

代码语言:javascript
复制
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));
     [....]
}

另一种解决方案:

代码语言:javascript
复制
    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));
     [....]
票数 6
EN

Stack Overflow用户

发布于 2011-08-18 17:38:32

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

代码语言:javascript
复制
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;
};

然后你可以这样初始化:

代码语言:javascript
复制
ov.push_back(MHD_OptionItem(MHD_OPTION_NOTIFY_COMPLETED, requestCompleted, NULL));
票数 0
EN

Stack Overflow用户

发布于 2011-08-18 17:39:53

引入一个构造函数和复制构造函数,

代码语言:javascript
复制
struct MHD_OptionItem
{
  //...
  MHD_OptionItem(MHD_OPTION, intptr_t, void*);  // makes struct a non-POD
  MHD_OptionItem(const MHD_OptionItem&) // copy constructor
};

并使用它进行初始化,

代码语言:javascript
复制
iov.push_back(MHD_OptionItem(MHD_OPTION_NOTIFY_COMPLETED, requestCompleted, NULL));

是的,您正在引入一个临时的。但是语法仍然很优雅。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7105284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档