对于其他类型的void_t,是否有标准的概括



在C++17中,我们有std::void_t,这使得SFINAE看起来更好:

template <typename T>
std::void_t<decltype(T::prop)> foo() { /* stuff */ }

仅当模板函数存在时T::prop才会存在。

如果T::prop存在,则模板函数foo()等效于以下内容:

template <typename T>
void foo() { /* stuff */ }

否则,代码等效于根本不声明foo()

标准库中其他类型的std::void_t是否有任何泛化,例如:

template<typename T, typename...>
using generic_t = T;

以便下面的代码有效?

template <typename T>
std::generic_t<int, decltype(T::prop)> foo() { /* stuff */ }

这相当于

template <typename T>
int foo() { /* stuff */ }

如果T::prop存在?

为什么需要这样的概括? void_t有点特别,因为它可以帮助您轻松编写类型特征,因为您可以拥有一个默认为 void 的初级类型以及使用 void_t 的专用化。例如:

template <class T, class = void>
struct has_prop : std::false_type { };
template <class T>
struct has_prop<T, std::void_t<decltype(T::prop)>> : std::true_type { };

这并不是说void有什么特别之处,你只需要在主要和专业之间商定一些类型。

不过,如果您只是直接在 SFINAE 中使用它,void_t没有多大意义。您可以将表达式粘贴到其他地方:

template <typename T, class = decltype(T::prop)>
void foo() { /* stuff */ }

此时,返回类型与您正在检查的条件完全分开,因此,如果您想int

template <typename T, class = decltype(T::prop)>
int foo() { /* stuff */ }

它可能不存在。它没有在文档中链接,因此我怀疑它的存在。但是您可以自己构建此类类型:

template <class type, class... sfinae_expressions>
using generic_t = type;

相关内容

  • 没有找到相关文章

最新更新