c++ - 使用枚举成员模板化成员函数

标签 c++ templates enums function-pointers

我正在编写一个可以在不同模式下实例化的类。一个简单的案例也许 可以根据模式计算不同类型均值的均值计算机。

该类将由其他一些代码实例化,并且该类代码将通过函数指针实现通用。必须定义与不同模式关联的特定函数,并根据模式设置指针。

我的是这样的

    enum StatMode { EMA, SMA} ;

    class MeanComputer {
    public:
        MeanComputer ();
        MeanComputer (const MeanComputer& orig);
        virtual ~MeanComputer();
        template <StatMode> double Update (double x);
        template <StatMode> double Sample (double x);
        void Reset();
        void setFunction() { 
            if (mode == EMA ) do_calc = /*EMA mode function*/ ;
        }  
        double (MeanComputer::*do_calc)(double);

    private:
        std::vector <double> window ;
        double mean ;
        double variance ;
        StatMode mode;
    };

    template <StatMode SMA> double MeanComputer::Update(double x) {
    }


    template <StatMode EMA> double MeanComputer::Update(double x) {
    }

但是这似乎没有编译并给出错误 错误:没有用于调用“MeanComputer::Update(double&)”的匹配函数

我该如何进行这项工作。 我理解一种方法是让每个这样的模式函数用不同的名称定义,并设置 然后是函数指针。虽然这似乎需要太多的命名,并且具有更清晰的模式模板函数似乎更优雅且更容易理解。

更新: 计算的方法不是在编译时设置的,而是在运行时设置的。然而,对于类的给定对象,模式保持不变,因此相应地设置指针将一劳永逸。 虚拟基类也可以,但在实际情况下很多计算都是通用的, 只有一些特定或小的功能取决于模式。一个人为的例子可能是 meancomputer 更新某种坐标对象,它采用一对模式类型,SMA/EMA 和纬度/经度。因此,一个实例可能是经度平均值,而另一个实例可能是纬度平均值。完整的计算是相同的,只是一个读取不同的成员。

最佳答案

template <StatMode SMA> double MeanComputer::Update(double x) {
}

语法错误

template <> double MeanComputer::Update<SMA>(double x) {
  return 7.0;
}

是您的特化方式。

这种技术很少是个好主意。

如果您希望在运行时确定计算方法,这完全是错误的做法,因为您需要一个编译时常量来确定要调用哪个 Update

您可以使用带有 template 类实现的纯虚拟基类来消除在工厂函数之外进行switch 的需要。

关于c++ - 使用枚举成员模板化成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25042747/

相关文章:

c++ - 使用 C++ 简洁地交换变量的值

c++ - 无法使用 {fmt} 库在一个字符串中格式化两个 float

c++ - 函数重载、继承和隐式构造函数 : weird priority

templates - Grails和gsp : How to render nested template with the same model/bean?

c# - 如何使用整数标志

c++ - 需要一种方法让这段代码运行得更快

javascript - GWT UiBinder - 渲染模板后执行 JS?

templates - meteor :检测嵌套模板中的事件

entity-framework - Entity Framework 5 和字符枚举

java - 尝试插入 java 枚举时出现 mongodb 编解码器注册表错误