矢量不同类型的模板类?

时间:2017-11-11 23:42:01

标签: c++ templates eigen eigen3

与我遇到的问题相关的代码如下。我试图使用Eigen编写神经网络。我想使用Eigen的张量为我的神经网络实现图层,但我不确定如何。 Eigen的张量要求我输入两个模板参数,一个类型和一个int,用于张量的维数。我将要使用的唯一类型是double,但是每个Layer需要输入Tensor并返回输出Tensor,可能具有不同的维度,所以我需要让Layer类具有这两个数字的模板。但是,这样做可以防止我拥有一个std :: vector of Layers。有没有办法解决?另外,正如您可能知道的那样,Layer类是抽象的,因为其他类将继承它(这就是为什么我希望能够将它放在std :: vector中)。我看过Boost的变体类,但我不确定我是否可以使用它,因为我不认为我可以去明确添加我可能使用的每种可能类型的层在运行它之前,我不知道它是否有可能以某种方式使用模板自动执行此操作。

#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

1 个答案:

答案 0 :(得分:0)

这样的东西?

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