Date: Sun, 26 Mar 2023 14:09:58 -0400
On Sun, 26 Mar 2023, 13:29 Phil Endecott via Std-Proposals, <
std-proposals_at_[hidden]> wrote:
> Dear Experts,
>
> #include <any>
> #include <cassert>
>
> class Base {};
> class Derived: public Base {};
>
> void f()
> {
> Derived d;
> std::any a{ d };
> auto p = std::any_cast<Base>(&a);
> assert(p); // Fails
> }
>
>
> To access a std::any's contained value we need to know its exact type;
> we cannot access it knowing only a base type.
>
> What would it take to make this possible?
>
> Essentially, if we imagine std::any to be something like:
>
> class any
> {
> type_info type;
> void* ptr;
> };
>
> So we could add something like:
>
> template <typename T>
> T* any_base_cast(any* a)
> {
> if (is_base_of(typeid(T),a.type)) return some_cast<T*>(a.ptr);
> else return nullptr;
> }
>
> There are a couple of issues with that!
>
> 1. We need a run-time is_base_of, which doesn't currently exist.
>
> 2. There isn't a suitable cast from void* to the base type. (In
> particular, it's
> clear that in the case of multiple inheritance we will need to apply an
> offset to
> get the correct base class.)
>
> Questions for the experts:
>
> * Am I right that this is not possible with the current core language?
>
> * I have the feeling that the run-time information needed to implement
> the missing is_base_of and cast needed here may already exist to
> support language features like member pointers and exceptions. Is
> that true?
>
Yes, I think we discussed this recently, possibly on this list. It's
certainly possible on Itanium. Obviously it wouldn't work for
implementations that have been made noncompliant by disabling rtti and /or
exceptions.
> * Do any of the existing introspection proposals help with this?
>
Very unlikely. Introspection is compile time, this is runtime.
>
> Regards, Phil.
>
>
>
> --
> Std-Proposals mailing list
> Std-Proposals_at_[hidden]
> https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals
>
std-proposals_at_[hidden]> wrote:
> Dear Experts,
>
> #include <any>
> #include <cassert>
>
> class Base {};
> class Derived: public Base {};
>
> void f()
> {
> Derived d;
> std::any a{ d };
> auto p = std::any_cast<Base>(&a);
> assert(p); // Fails
> }
>
>
> To access a std::any's contained value we need to know its exact type;
> we cannot access it knowing only a base type.
>
> What would it take to make this possible?
>
> Essentially, if we imagine std::any to be something like:
>
> class any
> {
> type_info type;
> void* ptr;
> };
>
> So we could add something like:
>
> template <typename T>
> T* any_base_cast(any* a)
> {
> if (is_base_of(typeid(T),a.type)) return some_cast<T*>(a.ptr);
> else return nullptr;
> }
>
> There are a couple of issues with that!
>
> 1. We need a run-time is_base_of, which doesn't currently exist.
>
> 2. There isn't a suitable cast from void* to the base type. (In
> particular, it's
> clear that in the case of multiple inheritance we will need to apply an
> offset to
> get the correct base class.)
>
> Questions for the experts:
>
> * Am I right that this is not possible with the current core language?
>
> * I have the feeling that the run-time information needed to implement
> the missing is_base_of and cast needed here may already exist to
> support language features like member pointers and exceptions. Is
> that true?
>
Yes, I think we discussed this recently, possibly on this list. It's
certainly possible on Itanium. Obviously it wouldn't work for
implementations that have been made noncompliant by disabling rtti and /or
exceptions.
> * Do any of the existing introspection proposals help with this?
>
Very unlikely. Introspection is compile time, this is runtime.
>
> Regards, Phil.
>
>
>
> --
> Std-Proposals mailing list
> Std-Proposals_at_[hidden]
> https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals
>
Received on 2023-03-26 18:10:13