C++内联模板策略功能

far*_*rth 0 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
Run Code Online (Sandbox Code Playgroud)

Calculator.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);
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

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

    calc.doStrategy<Calulator::Strategy>(calc.add,2,3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这失败了

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)’|
Run Code Online (Sandbox Code Playgroud)

==稍后编辑==

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;
}
Run Code Online (Sandbox Code Playgroud)

仍然失败:

undefined reference to `void Calculator::doStrategy<void (Calculator::*)(int, int)>(void (Calculator::*)(int, int), int, int)'
Run Code Online (Sandbox Code Playgroud)

Jac*_*ack 5

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

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

我建议你阅读如何指针成员函数的详细工作在这里,但因为你是使用C++的工作我真的建议你采取仿函数的优势.

  • 然后阅读我发布的链接,找到使用pinter到成员函数所需的所有细节,但我一直说使用仿函数会减轻很多痛苦,即使你最终会有一个更详细的解决方案. (2认同)