Boost logo

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