Re: a bit of reflection (doesn't work)
On 23 Jun., 02:11, Frank Bergemann <FBergem...@web.de> wrote:
[..]
i tried this one here to get information, if a class X inherits from a Feature class:
------------------------- snip ----------------------------------------
#include <iostream>
using namespace std;
struct NO
{
static const int VALUE = 0;
};
struct YES
{
static const int VALUE = 1;
};
namespace Feature
{
template <class Base>
I assume, "Base" should better be renamed to
"Derived", because you are supposed to provider
the sub-class type, right?
class Class
{
public:
Class() { };
~Class() { };
};
// template for indicator of Feature - default NO
template <class QueryBase>
class Indicator
{
public:
typedef NO VALUE;
};
// explicit instantiation of indicator of Feature<Base> - YES
template<class QueryBase>
class Indicator <Class<QueryBase> >
{
public:
typedef YES VALUE;
};
}; // namespace Feature
class TestA
{
public:
TestA() { };
~TestA() { };
};
class TestB : public Feature::Class<TestB>
{
public:
TestB() { };
~TestB() { };
};
OK, TestB *derives* from Feature::Class<TestB>,
but that doesn't mean that a template type deduction
will evaluate that TestB is the same as Feature::Class<TestB>
int main(int, char**)
{
TestB b;
cout << "Indicator<TestA> = " << Feature::Indicator<TestA>::VALUE::VALUE << endl;
cout << "Indicator<TestB> = " << Feature::Indicator<TestB>::VALUE::VALUE << endl;
cout << "Indicator<Feature<TestA> > = " << Feature::Indicator<Feature::Class<TestA> >::VALUE::VALUE << endl;
return 0;
}
------------------------- snap ----------------------------------------
But it doesn't work:
frank@frank-desktop-2:~$ g++ -o test test.cc
frank@frank-desktop-2:~$ ./test
Indicator<TestA> = 0
Indicator<TestB> = 0
Indicator<Feature<TestA> > = 1
Is there a way to get this information also for Feature::Indicator<TestB> ?
You may want to use boost::is_base_of<Feature::Class<TestB>, TestB>
or - if you use a compiler with C++0x feastures -
std::is_base_of<Feature::Class<TestB>, TestB> to check whether
TestB is a super-class of Feature::Class<TestB>. The is_base_of
traits also works for same types. Given this trait class you could
define a single primary template for Indicator, e.g.
template <class Derived>
struct Indicator {
typedef typename boost::mpl::if_c<boost::is_base_of<Class<Derived>,
Derived>::value, YES, NO>::type VALUE;
};
or
template <class Derived>
struct Indicator {
typedef typename std::conditional<std::is_base_of<Class<Derived>,
Derived>::value, YES, NO>::type VALUE;
};
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]