gpt4 book ai didi

C++ 初始化列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:39:24 25 4
gpt4 key购买 nike

我必须用 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++ 编译器,正如预期的那样,对我说:

警告:扩展初始化列表仅适用于 -std=c++0x 或 -std=gnu++0x

我知道我可以初始化一个临时结构,然后将其传递给 vector,但这种方法在我看来效率低下而且不够优雅。

我无法更改插入构造函数的结构,因为这不是我的代码,而是包含的库。

有没有不使用 c++0x 语法的优雅方法?

最佳答案

假设您不能更改 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));
[....]

关于C++ 初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7105284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com