我有一个工厂函数,可以创建Object类的实例。 Object类继承自std :: enable_shared_from_this。工厂函数创建一个继承Object来构建它的临时类。
当我输出Object类的typeid.name()时,我得到一个意外的结果。
完整的示例在这里,并已使用gcc-4.9.2和clang-3.5进行测试: http://coliru.stacked-crooked.com/a/d06047865a3bb477
这是工厂功能:
class ObjectBuilder
{
public:
template<typename T, typename... Args>
static std::shared_ptr<T> make_object(Args&&... args)
{
struct Access : public T {
Access(Args&&... args) :
T(std::forward<Args>(args)...) {
// empty
}
};
// call T's constructor
std::shared_ptr<T> ob =
std::make_shared<Access>(
std::forward<Args>(args)...);
return ob;
}
};
template<typename T, typename... Args>
static std::shared_ptr<T> make_object(Args&&...args)
{
return ObjectBuilder::make_object<T>(std::forward<Args>(args)...);
}
这是Object类:
class Object : public std::enable_shared_from_this<Object>
{
friend class ObjectBuilder;
public:
virtual ~Object() {}
std::type_info const & GetTypeInfo()
{
return typeid(*this);
}
protected:
Object() {}
};
构造对象并输出其typeid名称:
std::shared_ptr<Object> obj = make_object<Object>();
std::cout << demangle(obj->GetTypeInfo().name()) << std::endl;
我期望输出如下:
ObjectBuilder::make_object<Object>()::Access
取而代之的是解码输出:
std::shared_ptr<Object> ObjectBuilder::make_object<Object>()::Access
为什么一开始有std :: shared_ptr?它意味着什么?
也是一个有趣/可能相关的旁注:clang能够对输出进行解码,但gcc不是。损坏的输出是:
ZN13ObjectBuilder11make_objectI6ObjectIEEESt10shared_ptrIT_EDpOT0_E6Access