私のアプリケーションには、継承チェーンの最後にあるクラスのみが非抽象クラスである継承階層があります。また、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を使用しています。
ありがとう、ゴクル。