不同类型模板的向量类?
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
与我遇到的问题相关的代码如下。我正在尝试使用 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