개체 계층 구조를 반복하고 객체 계층 구조가 컴포지션을 사용하여 결합 된 알려진 클래스 집합으로 구성됩니다. 나는 계층 적/컴포지션을 그래픽으로 보여주기 위해 객체 모델을 만들고 싶습니다. 구성은 몇 가지 규칙에 따라 수행되지만 유동적이고 유연합니다.알려진 클래스 집합 내에서의 반사
몇 가지 클래스 (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;
}
유형 범위는 컴파일시 'eVal1'에서 eVal3'으로 알려 지거나 예제의 버그입니까? – pmr
Doxygen을 사용해 보셨습니까? 꽤 좋은 그래프를 출력한다고 생각합니다. –
예제에서 볼 수있는 eVal1에서 eVal3 유형의 범위는 컴파일 타임에 enum이 아니라 integer로 알려져 있습니다. 이름이 바뀌지 않는 마지막 열거 형을 사용하여 클래스의 총 수를 알 수 있습니다. – Ram