我想从模板类继承,其类型在派生类中定义。我不想使用组合,因为如果这样做,我必须授予对向量的公共访问权限或为每个对象编写一些方法,以便按照我想要的方式与向量进行交互。
有什么方法可以让这段代码工作吗?
(好吧,我只需在类之前声明我的结构,如 1)注释示例中所示,但我很有趣地知道是否有一些 hack 可以这样做......)
#include <vector>
#include <iostream>
class Interface
{
public:
virtual void populate() = 0;
};
template<typename T>
class Series : Interface
{
public:
T methodIwantToWriteOnce(int i) const { return mVec[i]; }
protected:
std::vector<T> mVec;
};
class SeriesInt : public Series<int>
{
public:
virtual void populate() override { mVec.push_back(42); }
};
/* 1) Working solution but outside the class */
// struct Coord
// {
// double x = 0.0;
// double y = 0.0;
// };
// class SeriesCoord : public Series<Coord>
// {
// public:
// virtual void populate() override { mVec.push_back({42.0, 42.0}); }
// };
/* 2) Impossible solution ? */
// Forward declaration
class SeriesCoord;
struct SeriesCoord::Coord; //useless I know but you see the idea
class SeriesCoord : public Series<SeriesCoord::Coord>
{
public:
struct Coord
{
double x = 0.0;
double y = 0.0;
};
virtual void populate() override { mVec.push_back({42.0, 42.0}); }
};
int main(int argc, char *argv[])
{
SeriesInt s1;
s1.populate();
std::cout << s1.methodIwantToWriteOnce(0) << std::endl;
SeriesCoord s2;
s2.populate();
std::cout << s2.methodIwantToWriteOnce(0).x << std::endl;
return 0;
}
不幸的是,这是不可能的,当您尝试用派生类型实例化基类时,派生类型中定义的任何类型都将是不完整的。 CRTP 在这里也无济于事。