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

C++ 如何动态访问函数对象的目标,c++,c++11,functor,C++,C++11,Functor,我有一个函数对象std::function的向量,所有这些对象都派生自一个公共基类base,如下所示。在迭代向量时,我希望访问并可能更改目标测试中的变量,例如测试。在编译时,std::function::target可以返回一个指向原始目标的指针,但是有没有一种方法可以在运行时实现这一点,即动态访问测试?函子向量可以由任意数量的不同目标函数组成。Boost不是此代码库的选项 #include <iostream> #include <functional> #includ

我有一个函数对象std::function的向量,所有这些对象都派生自一个公共基类base,如下所示。在迭代向量时,我希望访问并可能更改目标测试中的变量,例如测试。在编译时,std::function::target可以返回一个指向原始目标的指针,但是有没有一种方法可以在运行时实现这一点,即动态访问测试?函子向量可以由任意数量的不同目标函数组成。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;
}

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

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;

我相信这在std::function中是不可能的。是的,它看起来是这样的-有点令人沮丧,因为动态typeid可以通过target\u type获得。谢谢。谢谢,这将是解决这个例子的一个好方法,尽管它没有解决访问函子目标的问题。在我的场景中,我无法更改目标函数的结构,动态访问很方便,但可能不可能。[编辑:对不起,我没有投票特权!]
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;