|
Boost : |
Subject: Re: [boost] More flexible any_cast for boost::any
From: DeadMG (wolfeinstein_at_[hidden])
Date: 2013-11-28 13:48:48
At the moment, it's not possible to compose std::function on top of
boost::any because you can't get the interface back out of boost::any. But
with a polymorphic_any_cast, you can. Consider the following:
template<typename Signature> class function;
template<typename Ret, typename... Args> class function<Ret(Args...)> {
boost::any contents;
struct callable {
virtual Ret call(Args... args) = 0;
};
template<typename F> struct derived : callable {
F f;
derived(F obj) : f(std::move(obj)) {}
derived(derived&&) = default;
derived(const derived&) = default;
derived& operator=(derived&&) = default;
derived& operator=(const derived&) = default;
Ret call(Args... args) { return f(std::forward<Args>(args)...); }
};
public:
template<typename F> function(F f, /* constraint */ = 0)
: contents(derived<F>(std::move(f))) {}
function(const function&) = default;
function(function&&) = default;
function& operator=(const function&) = default;
function& operator=(function&&) = default;
explicit operator bool() const { return contents; }
Ret operator()(Args... args) {
if (auto callable =
boost::polymorphic_any_cast<callable*>(&contents))
return callable->call(std::forward<Args>(args)...);
throw std::bad_function_call();
}
};
Here, pretty much all of, well, everything, is just delegated to
boost::any. This isn't the entire interface, but enough that you should be
able to get the idea.
Even on an Itanium ABI system where boost::polymorphic_any_cast can become
a dynamic_cast or you assume future Standard support, this won't be as
efficient as a specialized std::function implementation, or one based on
the more appropriate value_ptr<T>. But the interface offered by
polymorphic_any_cast is substantially more flexible than is required here.
On 28 November 2013 13:36, Antony Polukhin <antoshkka_at_[hidden]> wrote:
> 2013/11/28 Alexander Nasonov <alnsn_at_[hidden]>
>
> > Antony Polukhin wrote:
> > > I'm not *the official* maintainer of the Boost.Any library, I'm just
> the
> > > one who made all the latest changes with rvalues and C++11 support. But
> > if
> > > there'll be no objections and the official maintainer won't appear I
> can
> > > add this functionality to Boost.Any.
> >
> > If I'm still the official maintainer I can happily pass my maintainership
> > to Antony.
> >
>
> Thanks! I'll do my best.
>
> --
> Best regards,
> Antony Polukhin
>
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
>
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk