首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用enum成员临时处理成员函数

使用enum成员临时处理成员函数
EN

Stack Overflow用户
提问于 2014-07-30 17:02:31
回答 1查看 81关注 0票数 0

我正在编写一个类,它可以在不同的模式下实例化。一个简单的例子可能是一台能根据模式计算不同类型的均值的计算机。

类将由其他代码进行实例化,类代码将通过函数指针进行泛型。必须定义与不同模式相关联的特定函数,并根据模式设置指针。

我所拥有的就像这样

代码语言:javascript
运行
复制
    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&)‘的调用没有匹配函数

我该怎么做呢。我理解的一种方法是用不同的名称定义每个这样的模式函数,然后设置函数指针。尽管这似乎需要太多的命名,并且拥有更干净的模式模板功能似乎更优雅和更容易理解。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-30 17:12:28

代码语言:javascript
运行
复制
template <StatMode SMA> double MeanComputer::Update(double x) {
}

是错误的语法

代码语言:javascript
运行
复制
template <> double MeanComputer::Update<SMA>(double x) {
  return 7.0;
}

是你的专长。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25042747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档