【问题标题】:Polymorphic operator on a list of boost::any?boost::any? 列表上的多态运算符
【发布时间】:2010-11-12 18:24:32
【问题描述】:

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

boost::any sum(list<boost::any> lst) {
    // return lst[0]+lst[1]+lst[2] etc
}

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

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

【问题讨论】:

    标签: c++ templates metaprogramming boost-any


    【解决方案1】:

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

    如果没有operator+ 函数的网格来处理包含类型的所有可能组合或常规运行时多态性,我不明白你怎么能做到这一点。

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

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

    【讨论】:

    • 对于最终输出,我可以强制转换为正确的类型。我只是想尽量避免在这里。
    • 所以您已经必须将boost::any 中的任何可能类型转换为您的目标?我会认真考虑这个设计。
    【解决方案2】:

    C++ 通过类型而不是名称匹配函数(并且运算符只是具有附加中缀语法的奇特函数),在编译时。 (而不是在运行时检查所涉及的对象是否支持请求的操作。)
    我能想到的唯一例外是虚函数。如果类型是多态的,您可以使用任何解决方法来缺少多方法(双重分派)。但既然它们可以是任何东西,我认为你不能这样做

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

    (IME 说这意味着,在很短的时间内,有人过来证明我错了。)

    【讨论】:

      【解决方案3】:

      没有。不适用于 boost::any 和 boost::variant(不符合您的“不枚举所有可能支持 operator+ 的可能类型”的要求)。

      您需要做的是自己制作。 boost::any 背后的概念非常简单。如果您查看文档,他们有一个链接到解释该技术的文章(它基本上是具有多态性的句柄/主体习语)。您需要做的就是确定各种对象必须具有的接口并编写“任何”接口并相应地实现。类似这样的东西:

      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+ 会对泛型类型做什么,所以我编造了一些对我来说意义不大的东西。您当然需要根据自己的需要进行更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多