c++ - std::dynamic_pointer_cast 的别名

标签 c++ c++11 templates

我正在尝试为 std::dynamic_pointer_cast 创建别名,但无法编写可编译的内容。

这就是我正在尝试的方法:

template <typename T1, typename T2>
using dcast = std::dynamic_pointer_cast<T1, T2>;

这有什么问题吗?

编译器错误:

gcc:命名空间“std”中的dynamic_pointer_cast'未命名类型'

clang:命名空间“std”中没有名为“dynamic_pointer_cast”的类型

VS:语法错误:标识符“dynamic_pointer_cast”

尝试一下:https://godbolt.org/g/akbqiu

编辑:正如 Brian 指出的,您只能为类型添加别名,而不能为函数添加别名。

我尝试过以下代码:

template <typename T1, typename T2>
auto& dcast = std::dynamic_pointer_cast<T1, T2>;

这似乎可以自行编译,但是一旦您尝试调用它,就会出现以下错误:

error: wrong number of template arguments (1, should be 2)

不过,您可以仅使用一个模板参数来调用 std::dynamic_pointer_cast 。哪个可以作为替代方案?

最佳答案

正如评论中所说,你必须创建一个新函数:

template <class T, class U> 
std::shared_ptr<T> dcast(const std::shared_ptr<U> &r) noexcept
{
    return std::dynamic_pointer_cast<T>(r);
}

关于c++ - std::dynamic_pointer_cast 的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51572567/

相关文章:

c++ - boost::asio 和事件对象

c++ - 从对象 vector 中提取元素

c++ - 稳定的时钟在系统范围内稳定吗?

jQuery 模板已被弃用?

c++ - 未调用模板化函数

c++ - 奇怪的编译器错误 : "undefined reference to ' main'"

c++ - EEPROM ESP8266 - 倒问号

c++ - 我们如何在指针中存储对对象的引用?

c++ - SFINAE 和 noexcept 说明符

javascript - jQuery .click() 不会从 Mustache.js 模板中的 <a> 触发