模板参数用作类成员

问题描述

我在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>;

那样,我将不必使用纯虚方法重写。但是我似乎无法弄清楚如何在applyActivation构造函数中设置成员变量applyActivationDerivativeLayer

我也是C ++模板的新手,我来自Java,所以请多多包涵。

解决方法

您需要传递而不是 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> {};

演示:https://godbolt.org/z/99h54a

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...