如何动态访问函数对象的目标

How to dynamically access target of function object

本文关键字:函数 对象 目标 访问 何动态 动态      更新时间:2023-10-16

我有一个函数对象(std::function)的向量,它们都派生自一个公共基类base,如下所示。在迭代向量时,我希望访问并可能更改目标中的变量 - 例如test。在编译时,std::function::target()可以返回指向原始目标的指针,但是有没有办法在运行时执行此操作 - 即动态访问test?函子的向量可以由任意数量的不同目标函数组成。Boost 不是此代码库的选项。

#include <iostream>
#include <functional>
#include <vector>
typedef std::function<double(double)> Tfunc;
struct base { bool test; };
struct half : public base {
  template<typename T> T operator()(T x) { return x*0.5; }
};
struct square : public base {
  template<typename T> T operator()(T x) { return x*x; }
};
int main() {
  std::vector<Tfunc> v;
  v.push_back( half() );
  v.push_back( square() );
  v[0].target<half>()->test=false;
  v[1].target<square>()->test=true;
  for (auto &f : v)
    std::cout << f(2.0) << " " << f.target_type().name() << "n";
  return 0;
}

输出:

1 4half
4 6square

你真的需要使用继承将测试变量放在函子中吗? 您可以像这样组合函子和测试变量:

struct math_operation
{
     Tfunc f;
     bool  test;
};
std::vector<math_operation> v;
v.push_back( math_operation() );
v.push_back( math_operation() );
v[0].f = half();
v[1].f = square();
v[0].test = false;
v[1].test = true;