【发布时间】:2023-04-02 01:28:02
【问题描述】:
我在Transforms.h 中定义了很多这样的方法:
#ifndef TRANSFORMS_H
#define TRANSFORMS_H
namespace Transforms
{
long double asech(long double x);
long double acsch(long double x);
long double asechDerivative(long double x);
long double acschDerivative(long double x);
long double identity(long double x);
long double identityDerivative(long double x);
};
#endif //!TRANSFORMS_H
我尝试创建一个这样的模板类:
// Layer.h
template<typename Forward, typename Backward>
class Layer
{
protected:
Matrix* previousActivation{ nullptr }, * error{ nullptr }, * delta{ nullptr };
Matrix& weights;
Vector& bias;
public:
const int inputs, neurons;
Forward applyActivation;
Backward applyActivationDerivative;
Layer(int inputs, int neurons, Matrix& weights, Vector& bias);
~Layer();
Matrix& activate(Matrix& x);
/*virtual Matrix& applyActivation(Matrix& x) = 0;
virtual Matrix& applyActivationDerivative(Matrix& x) = 0;*/
};
尝试并能够通过这样做来创建新图层
class Sigmoid: public Layer<sigmoid, sigmoidDerivative>;
这样我就不必使用纯虚拟方法进行覆盖。但我似乎无法弄清楚如何在Layer 构造函数中设置成员变量applyActivation 和applyActivationDerivative
我也是 C++ 模板的新手,我来自 Java,所以请多多包涵。
【问题讨论】:
-
该死我犯了这么多错误,感谢您花时间编辑@cigien!
-
没问题 :) 它们只是小错别字,你没有犯任何严重错误 :)
-
“不必重写纯虚方法” -- 你为什么要使用纯虚函数?纯虚函数的意义在于它确实必须被覆盖。
-
@JaMiT 是的,但是我编写的每个派生类都需要我实际编写样板代码以每次都覆盖它们=s 如果我可以使它们成为从模板参数设置的成员变量,我将能够使用 1 行 =O 创建派生类
-
@Lorenzo 关于覆盖:这是我认为您应该在问题中包含的信息。
标签: c++ class templates initialization member