在C++中,如何制作一个可以包含相同变体的矢量的变体?

Jef*_*ffV 6 c++ vector self-reference c++17 std-variant

我试图创建一个std :: variant,它可以包含相同变量的向量:

class ScriptParameter;
using ScriptParameter = std::variant<bool, int, double, std::string, std::vector<ScriptParameter> >;
Run Code Online (Sandbox Code Playgroud)

我正在重新定义ScriptParameter.它认为可能是因为模板参数无法向前声明?

有没有办法实现一个也可以包含相同类型变体数组的变体?

lll*_*lll 8

由于前向声明ScriptParameter是一个类,因此不能使用using别名.但是,这里没有任何内在错误,因为vector它只是一个指针,没有真正的循环依赖.

您可以使用继承:

class ScriptParameter;
class ScriptParameter
    : public std::variant<bool, int, double, std::string, std::vector<ScriptParameter> >
{
public:
    using base = std::variant<bool, int, double, std::string, std::vector<ScriptParameter> >;
    using base::base;
    using base::operator=;
};

int main() {    
    ScriptParameter sp{"hello"};
    sp = 1.0;
    std::vector<ScriptParameter> vec;
    sp = vec;    
    std::cout << sp.index() << "\n";  
}
Run Code Online (Sandbox Code Playgroud)


n. *_* m. 6

使用类型级别的定点运算符

#include <vector>
#include <variant>
#include <string>

// non-recursive definition 
template<class T>
using Var = std::variant<int, bool, double, std::string, std::vector<T>>;

// tie the knot
template <template<class> class K>
struct Fix : K<Fix<K>>
{
   using K<Fix>::K;
};

using ScriptParameter = Fix<Var>;

// usage example    
int main()
{
    using V = std::vector<ScriptParameter>;
    ScriptParameter k {V{1, false, "abc", V{2, V{"x", "y"}, 3.0}}};
}
Run Code Online (Sandbox Code Playgroud)

  • 你让我头晕。 (2认同)
  • 通过宙斯,这实际上可以编译。 (2认同)