繁体   English   中英

如何将参数包扩展为向量<any></any>

[英]How to expand a parameter pack into a vector<any>

编译问题错误:'std::vector' 的初始化没有匹配的构造函数

我正在构建的代码库有几个不需要可变参数模板参数的对象。 我想让他们接受 std::any 的向量。 我的对象以 HTML 实体命名,例如 H1、H2、PARAGRAPH。

object创建接口。

    template <class TYPE>
    auto _createElement(const std::vector<std::any> &attrs) -> TYPE & {
      std::unique_ptr<TYPE> e = std::make_unique<TYPE>(attrs);
      ViewManager::elements.push_back(std::move(e));
      return static_cast<TYPE &>(*ViewManager::elements.back().get());
    }

    template <class TYPE, typename... ATTRS>
    auto createElement(const ATTRS &... attribs) -> TYPE & {
    std::vector<std::any> attrvector{attribs...};
    return _createElement<TYPE>(attrvector);
    }

模板参数包扩展为 createElement function 上的向量未编译。 我使用的版本是 c++17

当我调用模板 function 时,我将属性对象传递给它。 模板参数中的一个,类似于 HTML 实体名称,但全部大写。 在参数包中是属性。 属性也是对象。

例如,以下是在模板 header 文件 viewManager.hpp 中定义的

    using PARAGRAPH = class PARAGRAPH : public Element {
      public:
      PARAGRAPH(const std::vector<std::any> &attribs)
          : Element({listStyleType::disc, marginTop{1_em}, marginLeft{1_em},
                     marginBottom{0_em}, marginRight{0_em}}) {
        setAttribute(attribs);
      }
    };

而在应用程序中,如 main.cpp

    auto &mainArea = createElement<DIV>(
        indexBy{"mainArea"}, objectTop{10_pct}, objectLeft{10_pct},
        objectWidth{90_pct}, objectHeight{90_pct}, textColor{50, 50, 50},
        background{100, 200, 200}, textFace{"FiraMono-Regular"}, 
        textSize{20_pt}, textWeight{400});

如您所见,该语法使用返回 numericFormat object 的用户定义文字。

到目前为止,我所拥有的完整源代码可以在C++ Source中看到。 我希望任何 object 包含数据,而不是您提到的指针。

我相信您的问题完全取决于_createElement的行为,我认为这是您正在使用的某个库 function 。 稍微更改您的代码以仅返回attrvector显示没有问题:

#include <iostream>
#include <vector>
#include <any>

template <typename... ATTRS>
std::vector<std::any> createElement(const ATTRS &... attribs) {
std::vector<std::any> attrvector{attribs...};
return attrvector;
}

using namespace std;
int main(int argc, char *argv[]) {
    auto vec = createElement(1.0f,2.0f,3u,4u,-1,"hello");
    for (const auto& z : vec) {
        std::cout << z.type().name() << std::endl;
    }
}

打印(使用 C++17 兼容版本的 clang++)

f
f
j
j
i
PKc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM