Я не уверен, что рекурсивное определение имеет смысл в этом случае.Он допускает произвольное количество вложенных векторов внутри одного ScriptParameter
.(По сути, мы говорим, что параметр сценария является либо одним значением, либо целым лесом значений.) Лучше разделить определение на две части:
// Represents the value of a single parameter passed to a script
using ScriptParameter = std::variant<bool, int, double, std::string>;
// Represents a collection of one or many script parameters
using ScriptParameterSet = std::variant<ScriptParameter, std::vector<ScriptParameter>>;
В качестве альтернативы, еслицель здесь состоит в том, чтобы определить параметр как один из набора вариантов плюс вектор этих же вариантов, вы можете попробовать немного магии шаблона:
template <class T, class U> struct variant_concat;
template <class... T, class U> struct variant_concat<std::variant<T...>, U>
{
using type = std::variant<T..., U>;
};
template <class T, class U> using variant_concat_t = typename variant_concat<T, U>::type;
using PrimitiveScriptParameter = std::variant<bool, int, double, std::string>;
using ScriptParameter = variant_concat_t<
PrimitiveScriptParameter,
std::vector<PrimitiveScriptParameter>>;
Это должно решить проблему удобства использования Lightness ниже.