不同类型模板的向量类?

Vector of different types of template classes?

与我遇到的问题相关的代码如下。我正在尝试使用 Eigen 编写神经网络。我想使用 Eigen 的张量来为我的神经网络实现层,但我不确定如何实现。 Eigen 的张量要求我输入两个模板参数,一个类型和一个表示张量维数的 int。我要使用的唯一类型是双精度类型,但每个层都需要一个输入张量和 return 一个输出张量,可能具有不同的维度,所以我需要层 class 有这两个数字的模板。但是,这样做会阻止我拥有 std::vector 层。有没有办法解决?另外,您可能会说,层 class 是抽象的,因为其他 classes 将从它继承(这就是为什么我希望能够将它放在 std::vector ).我查看了 Boost 的变体 class,但我不确定我是否可以使用它,因为我认为我无法明确添加我可能在 运行 之前使用的所有可能类型的层它,我不知道是否有可能以某种方式使用模板自动执行此操作。

#include <unsupported/Eigen/CXX11/Tensor>

template<int inputDims, int outputDims>
class Layer{
public:
    virtual ~Layer();
    virtual Eigen::Tensor<double,outputDims> fire(Eigen::Tensor<double,inputDims>) = 0;
    virtual Eigen::Tensor<double,outputDims> derivative(Eigen::Tensor<double,inputDims>) = 0;
};

std::vector<Layer> v; //Doesn't compile

是这样的吗?

class BaseLayer 
{
public:
    virtual ~BaseLayer() {};
};

template<int inputDims, int outputDims>
class Layer : public BaseLayer
{
public:

    void fire() { std::cout << inputDims << ":" << outputDims << std::endl; }
    void derivative() { std::cout << inputDims << ":" << outputDims << std::endl; }
};


int main()
{
    std::vector<BaseLayer *> v;
    BaseLayer *l1 = new Layer<10, 20>;
    v.push_back(l1);

    Layer<10, 20> *l11 = dynamic_cast<Layer<10, 20> *>(l1);
    if (l11)
        l11->fire();

    BaseLayer *l2 = new Layer<3,4>;
    v.push_back(l2);

    Layer<3,4> *l22 = dynamic_cast<Layer<3,4> *>(l2);
    if (l22)
        l22->derivative();

    return 0;
}

打印:

10:20
3:4