所以我昨天试着开始使用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() {}我想知道为什么我这么费劲才能用上它。这是一个空的std::initializer_list,{{}}这是一个有一个元素的元素,对吗?但是你需要把它们放在像Foo({{}})这样的构造函数中吗?或者使用另一个列表Foo{{{}}}。我是说,这看起来很简单,但我就是做不到。
顺便说一下,我想知道使用initializer_list和模板参数包哪个更好?两者都有移动语义,因为毕竟没有带参数包的临时对象?
发布于 2018-02-25 23:53:28
我不确定这是否是您想要的,但是如果您在构造函数中更改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。
https://stackoverflow.com/questions/48973060
复制相似问题