模板类对象的QVector 我正在学习C++和Qt,这有个问题。这里我有一个类,它必须包含模板类对象的QVector: template <class VAR1, class VAR2> class Operation { public: Operation(VAR1 num1, VAR2 num2, Operator op); double answer(); private: VAR1 m_number1; VAR2 m_number2; Operator m_operator; };
问题是操作(模板)类的对象可能包含另一个its类对象。当我尝试这样做时:模板类对象的QVector 我正在学习C++和Qt,这有个问题。这里我有一个类,它必须包含模板类对象的QVector: template <class VAR1, class VAR2> class Operation { public: Operation(VAR1 num1, VAR2 num2, Operator op); double answer(); private: VAR1 m_number1; VAR2 m_number2; Operator m_operator; };,c++,qt,templates,C++,Qt,Templates,问题是操作(模板)类的对象可能包含另一个its类对象。当我尝试这样做时: QVector<Operation> m_arr; QVector<Operation<double, double>> m_arr; QVector m_arr; 我需要这样做: template <class VAR1, class VAR2> QVector<Operation<VAR1, VAR2>> m_arr; 模板 QVector
QVector<Operation> m_arr;
QVector<Operation<double, double>> m_arr;
QVector m_arr;
我需要这样做:
template <class VAR1, class VAR2>
QVector<Operation<VAR1, VAR2>> m_arr;
模板
QVector m_arr;
这两种变体都会导致错误,因为QVector不喜欢模板,希望它们是类,如下所示:
QVector<Operation> m_arr;
QVector<Operation<double, double>> m_arr;
QVector m_arr;
但ofc它没有意义,因为我需要QVector,它包含的类不仅包含双变量。我不能使用std::variant,因为这种类型之一可能是类本身,它需要再次使用
东西。
请帮忙,我怎么做?模板
template <class VAR1, class VAR2>
QVector<Operation<VAR1, VAR2>> m_arr;
QVector m_arr;
无论容器是什么,这在C++中都是不可能的。原因是C++在编译时实现模板和模板解析,在运行时几乎没有关于类型的信息。这意味着您不能在不指定类型的情况下声明模板化对象(因此其专门化)
为了更好地理解这个概念,让我们使用VAR1=char和VAR2=char的操作
类,得到的类型的sizeof
将是(2+sizeof(Operator))
,而如果使用long,则它将是(16+sizeof(Operator))
。这不是唯一的问题,m_number2的偏移量也取决于m_number1的大小。最后,根据零成本抽象原则,在编译时选择使用哪种模板专门化(由编译器手动提供或生成)
实现您所寻求的灵活性的一种方法是定义一个可以容纳不同类型的类,即指向每个类型上运算符专门化的函数指针(查看stl中的std::function
实现)或一个大的开关
,将类型存储在类似枚举的东西中,并根据它选择行为
老实说,我不鼓励您实现这些解决方案中的任何一个,我认为为您的模板类型提供一个非模板包装器类是非常容易和可维护的,它们每个都有不同的构造函数,它们之间所有可能的值和操作都有一个一致的内部表示。您得到的错误到底是什么?