C++ 内联模板策略函数

标签 c++ templates

我是 C++ 模板的新手,请多多包涵。

我想做的是通过使用模板函数在我的类中实现某种策略模式。我认为这会内联策略。

我的理解是,这可以用仿函数来实现,但我不想引入新的类,我只想在我的类中内联策略函数。

假设我有一个类 Calculator

Calculator.h

#ifndef CALCULATOR_H
#define CALCULATOR_H


class Calculator
{
    public:
        Calculator();
        virtual ~Calculator();
        typedef void (*Strategy)(int param1, int param2);

        void add(int param1, int param2);

        template<class T>
        void doStrategy(T strategy, int param1, int param2);
    protected:
    private:
};

#endif

计算器.cpp

Calculator::Calculator()
{
    //ctor
}

Calculator::~Calculator()
{
    //dtor
}

void
Calculator::add(int param1, int param2)
{
    std::cout << "Sum " << param1+param2 << std::endl;
}

template<class T>
void
Calculator::doStrategy(T strategy, int param1, int param2)
{
    strategy(param1,param2);
}

main.cpp

int main()
{
    Calculator calc = Calculator();

    calc.doStrategy<Calulator::Strategy>(calc.add,2,3);
    return 0;
}

这失败了

error: no matching function for call to ‘Calculator::doStrategy(<unresolved overloaded function type>, int, int)’|
note: candidate is:|
note: template<class T> void Calculator::doStrategy(T, int, int)|
note:   template argument deduction/substitution failed:|
note:   cannot convert ‘calc.Calculator::add’ (type ‘<unresolved overloaded function type>’) to type ‘void (*)(int, int)’|

== 稍后编辑==

main.cpp

typedef void (Calculator::*Strategy)(int, int);
int main()
{
    Calculator calc = Calculator();
    Strategy strategy = &Calculator::add;

    calc.doStrategy<Strategy>(strategy,2,3);
    return 0;
}

仍然失败:

undefined reference to `void Calculator::doStrategy<void (Calculator::*)(int, int)>(void (Calculator::*)(int, int), int, int)'

最佳答案

void add(int param1, int param2) 不是静态方法,因此它是在对象实例上调用的。

这意味着它不能被强制转换为 typedef void (*Strategy)(int param1, int param2) 这是一个接受 2 个整数并且不返回任何内容的方法,因为前者 add 有一个隐含的 this ,它隐藏在代码中但在现实中存在。实际上该方法的签名是 void (Calculator::*)(int,int)。只需将方法设置为 static 就可以了。

我建议您详细阅读指向成员函数的指针是如何工作的here ,但由于您使用的是 C++,我真的建议您利用仿函数。

关于C++ 内联模板策略函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14178791/

相关文章:

c++ - 如何在 Visual Studio 的 CMake 中获取当前配置(发布/调试)

c++ - 推断/删除模板模板参数的类型

c++ - 为什么模板化的派生类可以在 gcc 上访问其基私有(private)成员?

c++ - clang 与 gcc 运行时差异 : c++ class template built w clang crashes w/o copy constructor, 使用复制构造函数构建 gcc 崩溃

c++ - C++ 模板类中的等效实例

c++ - 如何用 C++ 中的整数替换 char 数组中的某些项?

c++ - 开始使用适用于 Windows 的 ISOCPP.net C++ 构建时遇到问题 (nuwen)

c++ - 在 openCV 中无法解析类型和方法

c++ - cin 在 12 次 for 循环迭代后使我的程序崩溃?

c++ - 比较两个不同的枚举时,是否有避免警告的正确方法?