내 응용 프로그램에는 상속 체인의 끝에있는 클래스 만 추상화되지 않은 클래스 인 상속 계층 구조가 있습니다. 또한 boost :: variant의 일부 사용법이 있습니다. 나는 포인터와 타입을 취하고 객체가 그 타입에 속하는 지 여부를 말하는 함수를 작성하려고한다. 유형 식별
#define IsA(nodeptr, type) (checkType<type>(nodeptr))
template<typename Type, bool isAbstract, typename PtrType >
class CheckType
{
bool operator()(PtrType* ptr) { return (typeid(*ptr) == typeid(Type)); }
};
template<typename Type, typename PtrType >
class CheckType < Type, true, PtrType >
{
bool operator()(PtrType* ptr) { return (dynamic_cast<Type*>(ptr) != NULL); }
};
template<typename Type, BOOST_VARIANT_ENUM_PARAMS(typename T) >
class CheckType< Type, false, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
{
bool operator()(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>* ptr)
{
return (ptr->type() == typeid(Type));
}
}
template< typename Type, typename PtrType >
bool checkType(PtrType* nodePtr)
{
CheckType<Type, boost::is_abstract<PtrType>::value, PtrType> check;
return check(nodePtr);
}
예를
를 들어지금 부스트 변형이있는 경우, 내가 부스트 변형 저장하는 특정 유형의 여부를 확인하고 싶습니다. 누군가가 저를 도울 수 있습니까? 변형인지 아닌지 알아보기 위해 추가 매개 변수를 추가하고 싶지 않습니다. 추상성을 찾아 내기 위해서도 boost :: is_abstract를 사용하고 있습니다 ..
고마워, Gokul.
return (boost::get<Type*>(v) != 0);
그리고이 :
dynamic_cast가 청구서를 작성하지 않습니까? –
가능하면 동적 캐스트 대신에 typeid를 사용하고 싶습니다. Boost :: Variant가 동적 캐스팅과 작동하지 않습니다. – Gokul