Я пытаюсь перебрать иерархию объектов, и иерархия объектов состоит из известного набора классов, объединенных с использованием композиции.Я хотел бы построить объектную модель для графического отображения иерархии / композиции.Композиция сделана на основе нескольких правил, но она гибкая и гибкая.
Доступно несколько классов (25+), и количество строительных блоков увеличивается.Если я буду искать каждый тип в каждом другом типе, то у нас будет значительно большее количество возможных комбинаций.
Я мог бы построить большую таблицу, в которой я ищу каждый из других объектов для данного типа и рекурсивно строю объектную модель, но, возможно, есть лучший способ, и поэтому я спрашиваю экспертов.*
Можно ли узнать, присутствует ли переменная функции / члена в определенном типе во время выполнения.
Мой пример кода показан ниже:
#include <iostream>
struct Generic {};
struct SimpleType {int toString(){return 0;}};
enum ETypeVal{eVal1 = 0, eVal2 = 1, eVal3 = 2};
template <typename ETypeVal val>
struct Hello
{
int toString(){return 0;}
};
template <> struct Hello<eVal2>
{
int toString(){return 1;}
};
template <> struct Hello<eVal3>
{
};
template <class Type>
class TypeHasToString
{
public:
typedef bool Yes;
typedef short No;
static bool const value = (sizeof(HasToString<Type>(0)) == sizeof(Yes));
private:
template <typename T, T> struct TypeCheck;
template <typename T> struct ToString
{
typedef int (T::*fptr)();
};
template <typename T> static Yes HasToString(TypeCheck< typename ToString<T>::fptr, &T::toString >*);
template <typename T> static No HasToString(...);
};
int main(int argc, char *argv[])
{
// all this works fine
std::cout << TypeHasToString<Generic>::value << std::endl;
std::cout << TypeHasToString<SimpleType>::value << std::endl;
std::cout << TypeHasToString<Hello<eVal1>>::value << std::endl;
std::cout << TypeHasToString<Hello<eVal2>>::value << std::endl;
std::cout << TypeHasToString<Hello<eVal3>>::value << std::endl;
// Unable to deduce for type that are not known at compile time
// Is it possible to remove this limitation ?
for(int val = eVal1; val <= eVal3; val++)
{
std::cout << TypeHasToString< Hello< (ETypeVal)val > >::value << std::endl;
}
return 0;
}