【问题标题】:SFINAE make uniqueSFINAE 独一无二
【发布时间】: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&amp;&amp;... args) -&gt; decltype(std::unique_ptr&lt;T&gt;(new T(std::forward&lt;Args&gt;(args)...)))?
  • 如果 T 不能使用传递的参数构造,那么 new T(...) 应该会失败并给出编译器错误。您能否详细说明导致您提出这个问题的问题?也许你应该问这个?
  • 你想做什么?通常我看到人们想要这样的模板东西,因为他们希望它完全通过一个更通用的模板(例如,如果它的随机访问迭代器这样做,如果它是双向的就这样做,否则失败)。无论如何,只有一个模板会在new 上失败?
  • 它会失败我只是希望它是 sfinae 并给我一个指示,表明我在输入它们时没有提供正确的参数。这只是一件方便的事情。

标签: c++ c++11 templates unique-ptr


【解决方案1】:

如果您需要一种廉价的方法来检查 T(Args...) 是否是 SFINAE 友好的有效表达式,请考虑通过 尾随返回类型使用 表达式 SFINAE

template <typename T, typename... Args>
auto foo(Args&&... args) 
    -> decltype(T(std::forward<Args>(args)...), void())
{

}

如果T(std::forward&lt;Args&gt;(args)...) 不是有效的表达式,foo 将被“SFINAEd-out”。

【讨论】:

  • 有没有办法在 c++ 11 中做到这一点(没有自动返回)
  • @AndreasLoanjoe 这是 c++11 :)
  • 模板 auto make_unique(Args&&... args) -> decltype(std::unique_ptr(new T(std::forward (args)...)), void()) { return std::unique_ptr(new T(std::forward(args)...)); } 在 C++ 11 上为我返回 void
  • 模板 auto make_unique(Args&&... args) -> decltype(T(std::forward(args)...), void ()) { return std::unique_ptr(new T(std::forward(args)...)); } 也推导出为 void
  • @AndreasLoanjoe:当然,因为, void() 在那里 :)
猜你喜欢
  • 2011-09-27
  • 2013-12-24
  • 2014-04-18
  • 2011-12-30
  • 2015-10-18
  • 2019-05-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多