gpt4 book ai didi

c++ - 搞乱 initializer_list

转载 作者:行者123 更新时间:2023-11-28 04:47:30 25 4
gpt4 key购买 nike

所以我昨天尝试开始使用 std::initializer_list 但这并不是一个巨大的成功。这是我最后的尝试之一:

#include <unordered_map>
#include <string>

struct XmlState {

using U_StateFunc = std::function<void()>;
using U_MapStateFunc = std::unordered_map<std::string, U_StateFunc>;

U_StateFunc beforeProcess;
U_StateFunc afterProcess;
U_MapStateFunc funcMap;

XmlState
(U_StateFunc&& bProcess,
U_StateFunc&& aProcess,
std::initializer_list<typename U_MapStateFunc::value_type> mapParams)
: beforeProcess(std::move(bProcess)),
afterProcess(std::move(aProcess)),
funcMap(mapParams)
{}
};

template < size_t NB_STATES >
class XmlParser {

using U_StateArray = std::array<XmlState, NB_STATES>;
U_StateArray m_states;

public:
XmlParser
(std::initializer_list<typename U_StateArray::value_type> states)
: m_states{states}
{}

};

XmlParser<1> test {
{
{
XmlState::U_StateFunc(), XmlState::U_StateFunc(),
{
{ "Tag1", []() {} },
{ "Tag2", []() {} },
{ "Tag3", []() {} }
}
}
}};

int main() {}

Wandbox

我想知道为什么我这么费力地使用它。 {} 这是一个 std::initializer_list 空的,{{}} 这是一个只有一个元素的列表,对吗?但是您需要将它们放在构造函数中,例如 Foo({{}}) ?或者使用另一个列表 Foo{{{}}}。我的意思是,这看起来很简单,但我就是做不到。

顺便说一句,我想知道使用 initializer_list 还是模板参数包更好?都是move语义,因为毕竟没有带参数包的临时对象?

最佳答案

不确定这是否是您要查找的内容,但如果您将 XmlParser 更改为在构造函数中采用 U_StateArray,则可以使语法接近您的原始语法.

//Changed constructor in XmlParser
XmlParser (U_StateArray states) : m_states{states} {}

//Used like this
XmlParser<2> test {{

XmlState(XmlState::U_StateFunc(), XmlState::U_StateFunc(),
{
{ "Tag1", []() {} },
{ "Tag2", []() {} },
{ "Tag3", []() {} }
}),

XmlState(XmlState::U_StateFunc(), XmlState::U_StateFunc(),
{
{ "Tag4", []() {} },
{ "Tag5", []() {} }
})

}};

另一种选择是将 std::array 更改为 std::vector。那么你的代码就可以工作了,因为 std::vector 有一个 std::initializer_list 的构造函数。

第三种选择是制作一个助手,它接受一个 std::initializer_list 并返回一个合适的 std::array。点赞建议here .

关于c++ - 搞乱 initializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48973060/

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