|
Boost : |
From: SRobb_at_[hidden]
Date: 2004-07-07 04:45:37
I wrote that very thing a year or so ago for the purpose of testing if a
base pointer type can be statically downcast to a derived type. I don't
claim to have tested all permutations of its usage, but it certainly worked
on the cases I was testing it with.
However, it does have the unfortunate side-effect of generating an
'ambiguous base' warning on the later GCCs every time it is used with a
class which inherits another non-virtually. (though the traits class still
gives the correct answer) If anyone can find a way of preventing this
warning, or even an alternate implementation, I'd be glad to hear it.
Here is my basic implementation:
#include <boost/config.hpp>
#include <boost/type_traits/is_convertible.hpp>
namespace is_virtual_base_and_derived_detail
{
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4250)
#endif
template <typename BaseImpl, typename DerivedImpl>
struct tester : public DerivedImpl, virtual public BaseImpl
{
tester();
tester(const tester&);
};
#ifdef _MSC_VER
#pragma warning(pop)
#endif
template <typename Base, typename Derived, bool IsBaseAndDerived>
struct impl;
template <typename Base, typename Derived>
struct impl<Base, Derived, true>
{
BOOST_STATIC_CONSTANT(bool, value = sizeof(tester<Base,
Derived>) == sizeof(Derived));
};
template <typename Base, typename Derived>
struct impl<Base, Derived, false>
{
BOOST_STATIC_CONSTANT(bool, value = false);
};
}
template <typename Base, typename Derived>
struct is_virtual_base_and_derived :
is_virtual_base_and_derived_detail::impl<Base, Derived,
boost::is_convertible<Derived*, Base*>::value>
{
};
template <typename T>
struct is_virtual_base_and_derived<T, T>
{
BOOST_STATIC_CONSTANT(bool, value = false);
};
-----Original Message-----
From: boost-bounces_at_[hidden] [mailto:boost-bounces_at_[hidden]]
On Behalf Of Robert Ramey
Sent: Tuesday, July 06, 2004 6:01 PM
To: boost_at_[hidden]
Subject: [boost] Does anyone have an is_virtual_base_and_derived ?
Type traits includes:
::boost::is_base_and_derived<T,U>
Does anyone have a version that might be called
is_virtual_base_and_derived<B, D> which would return true iff D is derived
virtually from B ?
Robert Ramey
_______________________________________________
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