为什么此工厂函数的typeid名称不能按预期构建CRTP类?

时间:2015-03-17 23:36:50

标签: c++

我有一个工厂函数,可以创建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

0 个答案:

没有答案