【问题标题】:Template argument functions as class members作为类成员的模板参数函数
【发布时间】: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 构造函数中设置成员变量applyActivationapplyActivationDerivative

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

【问题讨论】:

  • 该死我犯了这么多错误,感谢您花时间编辑@cigien!
  • 没问题 :) 它们只是小错别字,你没有犯任何严重错误 :)
  • “不必重写纯虚方法” -- 你为什么要使用纯虚函数?纯虚函数的意义在于它确实必须被覆盖。
  • @JaMiT 是的,但是我编写的每个派生类都需要我实际编写样板代码以每次都覆盖它们=s 如果我可以使它们成为从模板参数设置的成员变量,我将能够使用 1 行 =O 创建派生类
  • @Lorenzo 关于覆盖:这是我认为您应该在问题中包含的信息。

标签: c++ class templates initialization member


【解决方案1】:

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

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

【讨论】:

  • 哦,我的问题是我没有指定模板类型? =o 这里的using 关键字只是为了“重新定义”/重命名类型对吗?
  • using 是为指向函数的指针声明一个短名称。您可以将其写在每个模板参数中,而不是 FuncT,但这会很丑。
  • 非常感谢您的帮助!这正是我想要的
猜你喜欢
  • 2011-07-06
  • 2016-06-25
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多