【发布时间】:2017-09-08 11:18:58
【问题描述】:
有没有办法检查类型T 是否可以用可变参数模板参数包Args... 构造?我不在乎解决方案是否有效,我只想在调试模式下使用 SFINAE 或 static_assert。
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
对于其他感兴趣的人来说,这个解决方案在 C++ 11 中对我有用
template<typename T, typename... Args>
auto make_unique(Args&&... args) -> decltype(std::unique_ptr<T>(new T(std::forward<Args>(args)...)))
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
【问题讨论】:
-
尾随返回类型?
auto make_unique(Args&&... args) -> decltype(std::unique_ptr<T>(new T(std::forward<Args>(args)...)))? -
如果
T不能使用传递的参数构造,那么new T(...)应该会失败并给出编译器错误。您能否详细说明导致您提出这个问题的问题?也许你应该问这个? -
你想做什么?通常我看到人们想要这样的模板东西,因为他们希望它完全通过一个更通用的模板(例如,如果它的随机访问迭代器这样做,如果它是双向的就这样做,否则失败)。无论如何,只有一个模板会在
new上失败? -
它会失败我只是希望它是 sfinae 并给我一个指示,表明我在输入它们时没有提供正确的参数。这只是一件方便的事情。
标签: c++ c++11 templates unique-ptr