コンパイルの問題エラー: 'std::vector' の初期化に一致するコンストラクターがありません
私が構築しているコード ベースには、可変個引数のテンプレート パラメーターである必要のないオブジェクトがいくつかあります。std::any のベクトルを受け入れるようにしたかったのです。私のオブジェクトは、H1、H2、PARAGRAPH などの HTML エンティティにちなんで名付けられています。
オブジェクト作成のインターフェース。
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 です
テンプレート関数を呼び出すと、属性オブジェクトが渡されます。テンプレート パラメーター内の 1 つで、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で見ることができます。あなたが言及したように、ポインタではなく、任意のオブジェクトにデータを含めたいと思います。