首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::any和templates

boost::any和templates
EN

Stack Overflow用户
提问于 2013-02-27 08:36:03
回答 1查看 1.5K关注 0票数 5

我正在写一个包含大量模板技巧和boost::any的库。我遇到了一种情况,我基本上有这样的情况:

代码语言:javascript
复制
boost::any a1, a2, a3, a4;

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

代码语言:javascript
复制
template <typename A1, typename A2, typename A3, typename A4>
void somefunc (A1 a1, A2 a2, A3 a3, A4 a4);

我可以求助于一系列嵌套得很糟糕的if语句,但假设我在处理10个不同的类型,那就是10000个if语句!Boost预处理器可以在这方面有所帮助,但这仍然是一个糟糕的解决方案。

有没有更好的方法来调用带有boost::any内容的模板化函数,而不是求助于这种疯狂?据我所知,没有。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-27 09:26:08

如果您的所有any对象都可以同时设置,那么您就可以立即对函数指针的类型进行硬编码。将其全部放入一个单独的对象中,就可以了。这基本上是对type-erasure的双重利用,也可以通过虚拟函数实现(就像boost::any的内部工作方式一样),但我更喜欢这个版本:

代码语言:javascript
复制
// 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)'
  }
};
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15102139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档