, .
, , ( , ...).
. , ; . CRTP, , . , Object < > templated from:
A:
B:
( <type_traits> , )
template <typename T>
struct has_subclasscount
{
template <typename U>
static typename std::enable_if<sizeof(U::subclasscount) != 0, int>::type test(int);
template <typename U>
static char test(...);
static const bool result = (sizeof(test<T>(0)) == sizeof(int))?(true):(false);
};
template <bool res, typename T>
struct return_subclasscount //the value to return is 0 if false
{
static const int result = 0;
};
template <typename T>
struct return_subclasscount<true, T> //returns subclasscount only if the first parameter is true
{
static const int result = T::subclasscount;
};
template <typename T>
struct get_subclasscount
{
static const int result = return_subclasscount<has_subclasscount<T>::result, T>::result;
};
template <typename This, typename Prev>
class Object
{
public:
static const int subclasscount = 1 + get_subclasscount<Prev>::result;
};
class sub1 : public Object<sub1, int>
{
};
class sub2 : public Object<sub2, sub1>
{
};
class sub3 : public Object<sub3, sub2>
{
};
3 - , . .
.cpp :
int main() {
std::cout << sub3::subclasscount;
char c;
std::cin >> c;
}
, :
3
, .
:
- , , .
- , , , ( , "endoflist", )/li >
, , , - . " ", " "; , -, ?
( , , subclasscount node )
- ?