我是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)
void add(int param1, int param2) 不是静态方法,因此它在对象的实例上调用.
这意味着它不能被转换typedef void (*Strategy)(int param1, int param2)为一个采用2个整数并且不返回任何内容的方法,因为前者add具有this隐藏在代码中但在现实中存在的隐含.实际上该方法的签名是void (Calculator::*)(int,int).只需将方法设置为static,它应该没问题.
我建议你阅读如何指针成员函数的详细工作在这里,但因为你是使用C++的工作我真的建议你采取仿函数的优势.
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |