使用std :: remove_pointer等操作在模板中构建派生类型

时间:2012-06-28 00:52:23

标签: c++ templates c++11 typetraits typename

所以我的代码如下:

shared_ptr<Foo> bar (my_normal_operator<Foo>(mumble));

尽管类型Foo来自左侧字段,但它的工作原理是返回类型仅通过给定的“添加”模式生成:

template <typename Target, typename Source>
shared_ptr<Target> my_normal_operator(Source src)
{
    /* ... whatever ... */
}

但是,如果情况看起来像这样:

shared_ptr<Foo> bar (my_pointer_operator<Foo*>(mumble));

需要某种方法将指针拉出类型。我挖了一下并找到std::remove_pointer,但是一个天真的应用程序给出了“类型/值不匹配”:

template <typename Target, typename Source>
shared_ptr< std::remove_pointer<Target>::type > my_pointer_operator(Source src)
{
    /* ... whatever ... */
}

我实际上没想到它会起作用......但是我把它放在这里作为表达我想要的意图!

叹息。每次我进入任何带有模板和特征的新领域时,我都觉得自己就像那些"I have no idea what I'm doing"模因动物中的一个。 : - /

1 个答案:

答案 0 :(得分:3)

您需要typename

template <typename Target, typename Source>
shared_ptr< typename std::remove_pointer<Target>::type >
    my_pointer_operator(Source src)
{
    /* ... whatever ... */
}

因为std::remove_pointer<Target>::type的类型取决于模板参数。

就个人而言,我会将Target保留为Foo并在my_pointer_operator的定义中使用typename std::add_pointer<Target>::type,因此调用者可以更直接地指定返回值。函数名称给出了实现上的差异。