C ++

所以我昨天试着开始使用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或模板参数包? 这两个都是移动语义,因为没有临时对象和参数包毕竟?


不知道这是否是您要查找的内容,但如果您更改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::initializer_list并返回一个合适的std::array 。 就像这里提到的

链接地址: http://www.djcxy.com/p/83739.html

上一篇: c++

下一篇: =default ignores access specifier?