识别类型
在我的应用程序中,有一个继承层次结构,其中只有位于继承链末尾的类是非抽象类。还有 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 变体,我想知道 boost 变体是否存储该特定类型。有人可以帮我吗?我不想添加额外的参数来确定它是否是一个变体。即使为了找出抽象性,我也在使用 boost::is_abstract ..
谢谢, 戈库尔。
In my application, there is a inheritance hierarchy in which only the classes that are at the end of the inheritance chain are non-abstract classes. Also there is some usage of boost::variant. I want to write a function which takes a pointer and a Type and says whether the object belongs to that type.
For example
#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);
}
Now if there is a boost variant, i want to find out whether the boost variant stores that particular type. Can someone help me with that? I don't want to add an extra parameter to find out whether it is a variant. Even for finding out the abstractness, i am using boost::is_abstract..
Thanks,
Gokul.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
嗯,有两个直接版本:
还有这个:
我不知道如何通过模板重载干净地处理这个问题,但你可以这样做:
Well there are two direct versions of this:
And this:
I am not sure how to handle that with your template overloading cleanly but you could do something like this:
处理 Boost.Variant 的最简洁方法通常是使用访问者。
然后你可以包装它:
可以像这样使用:
但这不是 OO 方式,也不是变体方式。
更好的想法是充分利用
Boost.Variant
的功能:注意
static_visitor
概念如何自然地处理继承。The cleanest way to deal with
Boost.Variant
is normally to use a Visitor.Then you can wrap it:
Which can be used like so:
However this is not the OO-way, and neither it is the variant-way.
A better idea would be to use the full power of
Boost.Variant
:Note how the
static_visitor
concept naturally handles inheritance.