C++ 内联模板策略功能
C++ Inline template strategy function
我是 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;
}
更普遍?
嗯下次...
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- C++17中的并行执行策略
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 如何使用策略在类中添加额外的功能层
- C++ 内联模板策略功能