如何使用ODEINT的标签系统为各种步进器类型做特定工作
how to use odeint's tag system to do specific work for various stepper types
我有一个模板化的类,可以用odeint的步进器类执行一些工作,我希望它是每个步进器类别的特定(不同)工作。
/// header file ///
template<class Stepper>
class foo {
typedef typename boost::numeric::odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
void do_work(double param);
// specific functions for various stepper types
void do_specific_work(double param, stepper_category);
}
/// cpp file ///
template<class Stepper>
void foo<Stepper>::do_work(double param)
{
do_specific_work(param, stepper_category());
}
// actual implementation of work for any stepper (i.e. exposing the basic functionality of stepper_tag)
template<class Stepper>
void foo<Stepper>::do_specific_work(double param, boost::numeric::odeint::stepper_tag)
{ ... }
// actual implementation of work for dense output stepper (i.e. exposing the functionality of dense_output_stepper_tag)
template<class Stepper>
void foo<Stepper>::do_specific_work(double param, boost::numeric::odeint::dense_output_stepper_tag)
{ ... }
问题是我得到了以下编译器错误:
error C2244: 'foo<Stepper>::do_specific_work' : unable to match function definition to an existing declaration
`
我尝试以与实现integrate_adaptive
等方法相同的方式来实现它,与我的情况不同的是,这些都是独立的函数(不是任何类的成员),不需要前向声明。如何修改代码以实现我的需求?提前感谢!
您需要为特定类别提供显式重载:
template<class Stepper>
class foo {
typedef typename boost::numeric::odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
// ...
void do_specific_work(double param, stepper_tag );
void do_specific_work(double param, dense_output_stepper_tag );
};
template< class Stepper >
void foo< Stepper >::do_specific_work( double param , stepper_tag ) { ... };
template< class Stepper >
void foo< Stepper >::do_specific_work( double param , dense_output_stepper_tag ) { ... };
您有一个声明do_specific_work(双参数,stepper_category)和几个定义。您的原型现在与定义不匹配。
// actual implementation of work for any stepper (i.e. exposing the basic functionality of stepper_tag)
如果您希望此方法与任何stapper_tag一起使用,则必须使用函数模板:
template<class StepperTag>
void do_specific_work(double param, StepperTag stepper);
以及实现:
template<class Stepper>
template<class StepperTag>
void foo<Stepper>::do_specific_work(double param, StepperTag stepper)
{ ... }
template<class Stepper>
void foo<Stepper>::do_specific_work(double param, boost::numeric::odeint::dense_output_stepper_tag stepper)
{ ... }
相关文章:
- 需要反转音频步进公式
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 锁定步进pthread互斥
- 在 ODEINT 中通过 if 语句选择步进器
- boost odeint 中的受控误差步进器是否支持复杂的数据类型?
- 创建带有限幅器的步进器控件
- 班上的Arduino步进电动机指针不起作用
- 生成最多给定数字 N 的步进数字
- Boost ODEINT:具有自定义类和向量空间代数的受控步进器
- 我如何仅使用一个Arduino uno才能在同一时间和同一方向上旋转两个步进电动机
- 如何使步进电机运行,直到我按下 Arduino 上的特定键盘按钮
- Arduino Sonar和步进马达
- 这些步进回合是否等效
- 使用C++同步控制多个步进器
- 接口 C++ 以使用 Arduino 控制电机步进器
- 步骤程序?开始、结束、步进整数
- 如何使用ODEINT的标签系统为各种步进器类型做特定工作
- 通过替换模板<类步进器来要求>
- GDB 继续而不是步进
- cpp std::list 使用步进添加新元素