使用 std::remove_pointer 等操作在模板中构建派生类型
Using operations like std::remove_pointer to build derivative types in templates
所以当我有这样的代码时:
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 ... */
}
我其实没想到它会起作用...但我把它放在这里是为了表达我正在寻找的意图!
叹息。 每次我踏入任何具有模板和特征的新领域时,我都会觉得自己是那些"我不知道我在做什么"的模因动物之一。 :-/
你需要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
的定义范围内,因此调用者可以更直接地指定返回值。函数名称给出了实现的差异。
相关文章:
- 在 C++ 中用派生类型重写成员函数
- 在 C++ 中将对象转换为派生类型
- C++如果采用类类型的函数被传递派生类型,有没有办法给出错误?
- 返回派生类型时出现协变类型错误
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 基于派生类型的编译时行为分支
- 按类型排序向量并按类型或派生类型搜索
- 为什么"运算符<<"不适用于指向派生类型的成员?
- 无法返回派生类型的标准::unique_ptr<>
- 无法从派生类型的作用域访问另一个实例的受保护成员
- dynamic_cast到具有未知模板参数的派生类型
- 派生类型的成员
- 视觉C++ dynamic_cast返回 NULL,尽管对象是派生类型
- 在运算符中动态强制转换为派生类型<<
- 如何在不转换回基类类型的情况下返回派生类型的对象?
- 将派生指针分配给C 中的其他派生类型
- 如何将派生类型的对象放在用于基本类型的向量中
- C++ - 无法将派生类型作为基类型列表传递给构造函数
- 如何在基本类型参考中存储对派生类型的参考
- 统一处理具有协变类型的函数指针(如何使用派生类型调用回调?