从模板类继承并在派生类中定义类型

问题描述 投票:0回答:1

我想从模板类继承,其类型在派生类中定义。我不想使用组合,因为如果这样做,我必须授予对向量的公共访问权限或为每个对象编写一些方法,以便按照我想要的方式与向量进行交互。

有什么方法可以让这段代码工作吗?

(好吧,我只需在类之前声明我的结构,如 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;
}
c++ inheritance
1个回答
0
投票

不幸的是,这是不可能的,当您尝试用派生类型实例化基类时,派生类型中定义的任何类型都将是不完整的。 CRTP 在这里也无济于事。

© www.soinside.com 2019 - 2024. All rights reserved.