boost :: any和模板

Xta*_*etl 5 c++ templates boost-any

我正在写一个涉及大量模板技巧和boost :: any的库.我遇到了一个我基本上有这个的情况:

boost::any a1, a2, a3, a4;
Run Code Online (Sandbox Code Playgroud)

...我需要调用一个如下所示的函数:

template <typename A1, typename A2, typename A3, typename A4>
void somefunc (A1 a1, A2 a2, A3 a3, A4 a4);
Run Code Online (Sandbox Code Playgroud)

我可以使用一个淫秽嵌套的if语句系列,但假设我正在处理10种不同的类型,那就是10,000 if语句!Boost预处理器可以在这里提供帮助,但这仍然是一个可怕的解决方案.

有没有更好的方法用boost :: any的内容调用模板化函数而不诉诸这种疯狂?据我所知,没有.

Xeo*_*Xeo 10

如果any可以同时设置所有对象,则可以在那里硬编码函数指针的类型.把它全部塞进一个单独的物体,你很高兴.这基本上是一种双重类型擦除,也可以通过虚函数实现(比如boost::any内部工作),但我更喜欢这个版本:

// note that this can easily be adapted to boost::tuple and variadic templates
struct any_container{
  template<class T1, class T3, class T3>
  any_container(T1 const& a1, T2 const& a2, T3 const& a3)
    : _ichi(a1), _ni(a2), _san(a3), _somefunc(&somefunc<T1, T2, T3>) {}

  void call(){ _somefunc(_ichi, _ni, _san); }

private:
  boost::any _ichi, _ni, _san;
  // adjust to your need
  typedef void (*func_type)(boost::any&, boost::any&, boost::any&);
  func_type _somefunc;

  template<class T1, class T2, class T3>
  void somefunc(boost::any& a1, boost::any& a2, boost::any& a3){
    // access any objects with 'boost::any_cast<TN>(aN)'
  }
};
Run Code Online (Sandbox Code Playgroud)