模板参数函数作为 class 成员
Template argument functions as class members
我在 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
然后我尝试创建一个模板化的 class,如下所示:
// 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 所以请多多包涵。
您需要传递 values 而不是 types 作为模板参数。这是一个使用您的代码的简化示例,删除了所有不必要的细节并添加了几个方法来演示模板参数的用法。
long double sigmoid(long double x);
long double sigmoidDerivative(long double x);
using FuncT = long double(*)(long double);
template<FuncT Forward, FuncT Backward>
class Layer
{
public:
long double applyForward(long double x) { return Forward(x); }
long double applyBackward(long double x) { return Backward(x); }
};
class Sigmoid : public Layer<sigmoid, sigmoidDerivative> {};
我在 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
然后我尝试创建一个模板化的 class,如下所示:
// 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 所以请多多包涵。
您需要传递 values 而不是 types 作为模板参数。这是一个使用您的代码的简化示例,删除了所有不必要的细节并添加了几个方法来演示模板参数的用法。
long double sigmoid(long double x);
long double sigmoidDerivative(long double x);
using FuncT = long double(*)(long double);
template<FuncT Forward, FuncT Backward>
class Layer
{
public:
long double applyForward(long double x) { return Forward(x); }
long double applyBackward(long double x) { return Backward(x); }
};
class Sigmoid : public Layer<sigmoid, sigmoidDerivative> {};