使用枚举成员来模拟成员函数

时间:2014-07-30 17:02:31

标签: 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&amp;)'

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

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

1 个答案:

答案 0 :(得分:1)

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

是错误的语法

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

是你的专长。

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

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

您可以使用具有template类实现的纯虚基类来消除对工厂函数之外的switch的需要。

相关问题