gpt4 book ai didi

c++ - 了解别名模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:54 28 4
gpt4 key购买 nike

我问了一个question有几个对代码的引用:

template <typename...>
using void_t = void;

我相信我有一个普遍的误解alias templates :

您为什么不评估您传递给 enable_if_t 中的别名模板的任何模板参数?或 conditional_t声明?

上面的代码只是做一个enable_if_t吗?一次处理多个模板参数?

其次,我认为我对void_t的作用有特定的误解。 . This comment声明 C++17 标准定义了 void_t .这是我没有得到的:

不是 void_t只是一个随意的名字?如果我仍然必须定义 template <typename...> using void_t = void;无论我打算使用 void_t标准化任意名称有什么意义?

最佳答案

在您的链接问题中 Barry 的示例中:

template<typename T, typename = void>
struct has_to_string
: std::false_type { };

template<typename T>
struct has_to_string<T,
void_t<decltype(std::to_string(std::declval<T>()))>
>
: std::true_type { };

void_t仅用于翻译 decltype 推导的类型至 void以便它匹配 primary 模板定义的默认参数。 SFINAE 全部由 decltype 负责表达。您可以轻松地执行以下操作:

//use , void() instead of wrapping in void_t
//this uses the comma operator to check the type of the to_string call, then change the type to void
decltype(std::to_string(std::declval<T>()), void())

以前的版本更容易阅读并且void_t不需要 decltype去工作。

如果void_t在您的实现中可用,您无需重新定义它。当它被标准化后,它将像标准中的任何其他别名模板一样可用。

这样想:如果Tint , 它有一个有效的 std::to_string重载,扣除将如下所示:

has_to_string<int> -> has_to_string<int,void>因为默认参数。因此,让我们寻找 has_to_string 的特化有了这些论点。

template<typename T>
struct has_to_string<T,
void_t<decltype(std::to_string(std::declval<T>()))>
>
: std::true_type { };

好吧,那是一些 T 的偏特化和一些依赖类型。让我们算出那个类型:

void_t<decltype(std::to_string(std::declval<T>()))>
//std::to_string(int&&) is valid and returns a std::string
void_t<std::string>
//void_t changes types to void
void

现在我们的特化看起来像这样:

template<>
struct has_to_string<int,void>
: std::true_type { };

这与我们对 has_string<int,void> 的实例化相匹配, 所以 has_to_string<int>继承自 std::true_type .

现在想想当Tstruct Foo{}; .同样,让我们​​计算出依赖类型:

void_t<decltype(std::to_string(std::declval<T>()))>
//wait, std::to_string(Foo&&) doesn't exist
//discard that specialization

丢弃该特化后,我们回到主要模板:

template<typename T, typename = void>
struct has_to_string
: std::false_type { };

所以 has_to_string<Foo>继承自 std::false_type .

关于c++ - 了解别名模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30302423/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com