假设我有一个类型为list<boost::any>的列表,其中有一些未知的类型。现在假设我想对列表中的多态元素应用一些操作。在这种情况下,考虑+运算符。假设我知道该列表将始终包含一组支持operator+的同质对象,并且我希望获得在列表的每个元素之间应用operator+ (某种意义上的“和”)到一个新的boost::any中的结果。如下所示:
boost::any sum(list<boost::any> lst) {
// return lst[0]+lst[1]+lst[2] etc
}在不枚举所有可能支持operator+的类型的情况下,有没有办法做到这一点?我对疯狂的想法非常开放。
(我真的有一个好的理由这样做…我正在实现一个解释器)
发布于 2010-11-13 02:35:42
如果您知道列表中可能的类型范围,则可以使用boost::variant。
如果没有一系列operator+函数来处理每种可能的包含类型组合或常规运行时多态性,我不明白如何做到这一点。
我想知道您希望在最终的boost::any输出中看到的具体类型是什么?
顺便说一句,如果你正在实现一个解释器,请查看Boost.Spirit,它可能会在这里说明你的设计问题。
发布于 2010-11-13 02:35:55
C++根据函数的类型(而不是名称)匹配函数(运算符仅仅是具有附加中缀语法的花哨函数),即在编译时中的。(而不是在运行时检查所涉及的对象是否支持所请求的操作。)
我能想到的唯一例外是虚函数。如果类型是多态的,您可以使用任何解决方法来解决缺少的多方法(双重调度)。但是因为它们可以是任何东西,我不认为你可以这样做,。
如果您有一组有限的类型,模板元编程可能会帮助生成函数实现加法。但如果涉及的类型数量有限,您可能会使用boost::variant。
(我说这意味着,在很短的时间内,有人出现并证明我错了。)
发布于 2010-11-13 03:10:52
不是的。不能使用boost::any,也不能使用boost::variant (不会限定您的,“不会枚举所有可能支持operator+的类型”)。
你需要做的就是做你自己的。boost::any背后的概念非常简单。如果你看一下文档,他们有一个链接到一篇解释这项技术的文章(它基本上是带有多态性的句柄/主体习惯用法)。所有你需要做的就是决定你的各种对象必须有什么接口,并编写“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+会对泛型类型做什么,所以我编造了一些对我来说很有意义的东西。当然,您需要根据自己的需要进行更改。
https://stackoverflow.com/questions/4167814
复制相似问题