2009-11-20 71 views
2

我可以知道有什么方法可以从boost :: any中确定父类吗?确定父类从boost :: any

#include <iostream> 
#include <boost/any.hpp> 

class a { 
public: 
    virtual ~a() {} 
}; 

class b : public a { 
}; 

bool is_class_a(const boost::any& any) 
{ 
    return boost::any_cast<a>(&any) != 0; 
} 

bool is_class_a_v2(const boost::any& any) 
{ 
    try 
    { 
     boost::any_cast<a>(any); 
     return true; 
    } 
    catch(const boost::bad_any_cast &) 
    { 
     return false; 
    } 
} 

int main() 
{ 
    std::cout<< is_class_a(b())<< std::endl; // return 0. but i wish to return 1. 
    std::cout<< is_class_a(a())<< std::endl; // return 1. 

    std::cout<< is_class_a_v2(b())<< std::endl; // return 0. but i wish to return 1. 
    std::cout<< is_class_a_v2(a())<< std::endl; // return 1. 
} 

回答

2

boost::any被设计为使其具有强信息对象,其身份不重要。如果你想使用多态类型,那么你可以使用指针基类或boost::shared_ptr与基类,而不是boost::any

+0

的确,'boost :: any'意味着你必须知道存储值的确切类型,通常使用polymoprhism,所以你不需要知道确切的类型。在这种情况下,这意味着你的测试将尝试any_cast到所有派生类'a',但这有些适得其反。 – UncleBens 2009-11-20 08:01:55

0

下面是为什么它不起作用:any_cast是一个模板。 boost :: any使用“类型擦除”,这意味着实际类型隐藏在某种类型中立的抽象接口后面。 any_cast实现可用的唯一信息是void*指针和type_info对象。但在这种情况下,没有支持投射的dynamic_cast运算符。因此any_cast<T>只是将存储对象的type_info对象与typeid(T)进行比较,如果它们与它匹配reinterpret_castvoid*指针。

如果你想使用多态,你应该使用一些其他的包装类比boost :: any(可能类似于“clone_ptr”,“shared_ptr”,或者你自己的专用于这个基类的包装器)。

-1
struct a { 
    virtual ~a() {} 

    template<typename T> 
    inline static bool is_subclass(T const & x) { 
    return dynamic_cast<a const *>(&x) != NULL ; 
    } 

}; 

struct b : public a { 
}; 
struct c { virtual ~c() {} } ; 

int main() { 
    a x ; b y; c z ; 
    std::cout << a::is_subclass(x) << std::endl; 
    std::cout << a::is_subclass(y) << std::endl; 
    std::cout << a::is_subclass(z) << std::endl; 
    return 0 ; 
} 

请注意dynamic_cast需要多态类型才能工作。

+0

与问题无关。我正在讨论boost :: any。 – 2009-11-20 16:57:00

相关问题