Как расширить пакет параметров в вектор <any> - PullRequest
0 голосов
/ 30 сентября 2019

Ошибка задачи компиляции: нет подходящего конструктора для инициализации 'std :: vector'

База кода, которую я создаю, содержит несколько объектов, которые не обязательно должны быть параметрами шаблона переменной. Я хотел, чтобы они приняли вектор std :: any. Мои объекты названы в честь сущностей HTML, таких как H1, H2, PARAGRAPH.

Интерфейс для создания объекта.

    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 не компилируется. Я использую версию c ++ 17

Когда я вызываю функцию шаблона, я передаю ей объекты атрибутов. Один в параметре шаблона, который сравнивается с именем сущности HTML, но с заглавной буквы. И в пакете параметров находятся атрибуты. Атрибуты также являются объектами.

Например, в заголовочном файле шаблона 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.

Полный исходный код, который у меня есть, можно увидеть в C ++ Source ,Я хочу, чтобы любой объект содержал данные, а не указатель, как вы упомянули.

1 Ответ

1 голос
/ 30 сентября 2019

Я считаю, что ваша проблема полностью зависит от поведения _createElement, которое, как я полагаю, является некоторой библиотечной функцией, которую вы используете. Незначительное изменение кода для простого возврата 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;
    }
}

отпечатков (с использованием Clan 17-совместимой версии clang ++)

f
f
j
j
i
PKc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...