首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boost::any?列表上的多态运算符

boost::any?列表上的多态运算符
EN

Stack Overflow用户
提问于 2010-11-13 02:24:32
回答 3查看 473关注 0票数 2

假设我有一个类型为list<boost::any>的列表,其中有一些未知的类型。现在假设我想对列表中的多态元素应用一些操作。在这种情况下,考虑+运算符。假设我知道该列表将始终包含一组支持operator+的同质对象,并且我希望获得在列表的每个元素之间应用operator+ (某种意义上的“和”)到一个新的boost::any中的结果。如下所示:

代码语言:javascript
运行
复制
boost::any sum(list<boost::any> lst) {
    // return lst[0]+lst[1]+lst[2] etc
}

在不枚举所有可能支持operator+的类型的情况下,有没有办法做到这一点?我对疯狂的想法非常开放。

(我真的有一个好的理由这样做…我正在实现一个解释器)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-13 02:35:42

如果您知道列表中可能的类型范围,则可以使用boost::variant

如果没有一系列operator+函数来处理每种可能的包含类型组合或常规运行时多态性,我不明白如何做到这一点。

我想知道您希望在最终的boost::any输出中看到的具体类型是什么?

顺便说一句,如果你正在实现一个解释器,请查看Boost.Spirit,它可能会在这里说明你的设计问题。

票数 3
EN

Stack Overflow用户

发布于 2010-11-13 02:35:55

C++根据函数的类型(而不是名称)匹配函数(运算符仅仅是具有附加中缀语法的花哨函数),即在编译时中的。(而不是在运行时检查所涉及的对象是否支持所请求的操作。)

我能想到的唯一例外是虚函数。如果类型是多态的,您可以使用任何解决方法来解决缺少的多方法(双重调度)。但是因为它们可以是任何东西,我不认为你可以这样做,

如果您有一组有限的类型,模板元编程可能会帮助生成函数实现加法。但如果涉及的类型数量有限,您可能会使用boost::variant

(我说这意味着,在很短的时间内,有人出现并证明我错了。)

票数 1
EN

Stack Overflow用户

发布于 2010-11-13 03:10:52

不是的。不能使用boost::any,也不能使用boost::variant (不会限定您的,“不会枚举所有可能支持operator+的类型”)。

你需要做的就是做你自己的。boost::any背后的概念非常简单。如果你看一下文档,他们有一个链接到一篇解释这项技术的文章(它基本上是带有多态性的句柄/主体习惯用法)。所有你需要做的就是决定你的各种对象必须有什么接口,并编写“any”接口,它就会相应地被实现。类似于这样的东西:

代码语言:javascript
运行
复制
struct my_any
{
  template < typename T >
  my_any(T const& t) : pimpl(new impl<T>(t)) {}
  ...
  some_type get_some_type() const;
   ...
private:
  struct impl_base
  {
    ....
    virtual some_type get_some_type() const = 0;
  };
  template < typename T >
  struct impl : impl_base
  {
    some_type get_some_type() const { return t.get_some_type(); }
    impl(T const& t_var) : t(t_var) {}
    ....
  };
  boost::scoped_ptr<impl_base> pimpl;
};

some_type operator+ (my_any const& a, my_any const& b)
{
  return a.get_some_type() + b.get_some_type();
}

很难想象operator+会对泛型类型做什么,所以我编造了一些对我来说很有意义的东西。当然,您需要根据自己的需要进行更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4167814

复制
相关文章

相似问题

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