首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >摆弄initializer_list

摆弄initializer_list
EN

Stack Overflow用户
提问于 2018-02-25 19:48:32
回答 1查看 82关注 0票数 0

所以我昨天试着开始使用std::initializer_list,但并不是很成功。这是我最后的一次尝试:

代码语言:javascript
复制
#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和模板参数包哪个更好?两者都有移动语义,因为毕竟没有带参数包的临时对象?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-25 23:53:28

我不确定这是否是您想要的,但是如果您在构造函数中更改XmlParser以获取U_StateArray,则可以使语法接近原始语法。

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

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

https://stackoverflow.com/questions/48973060

复制
相关文章

相似问题

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