C++ 内联模板策略功能

C++ Inline template strategy function

本文关键字:策略 功能 C++      更新时间:2023-10-16

我是 c++ 模板的新手,所以请耐心等待。

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

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

假设我有一个班级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);
}

主.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)’|

== 稍后编辑 ==

主.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 应该没问题。

我建议您在此处详细阅读指向成员函数的指针的工作原理,但由于您正在使用C++我真的建议您利用函子。

我的英语很短...只是保持代码...

在计算器中。

// this template function use only for calculator's method
// and method must have two arguments.
template<typename Method>
void doStrategy(Method strategy, int param1, int param2)
{
    // argument strategy MUST BE calculator's member function pointer,
    // member function pointer need object, not class
    (this->*strategy)(param1, param2);
}

在主要.cpp

Calculator cal;
cal.doStrategy(&calculator::add, 2, 3);

.. 更一般...

在计算器中。

// this template function do not use only for calculator's method
// but method must have two arguments.
template<typename Class, typename Method>
void doStrategy(Class* pObject, Method strategy, int param1, int param2)
{
    // argument strategy MUST BE Class's member function pointer,
    // member function pointer need object, not class
    (pObject->*strategy)(param1, param2);
}

在主要.cpp

// definition of another member function...
struct foo
{
    void bar(int param1, param2)
    {
        std::cout << "foo::bar " << param1 - param2 << std::endl;
    }
};
int main()
{
    Calculator cal;
    foo test;
    cal.doStrategy(&cal, &calculator::add, 2, 3);
    cal.doStrategy(&test, &foo::bar, 2, 3);
    foo* just_for_member_function = NULL;
    cal.doStrategy(just_for_member_function, &foo::bar, 5, 1); 
    return 0;
}

更普遍?

嗯下次...