gpt4 book ai didi

c++ - enable_if 用于没有返回类型的函数

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

我最近遇到了一个有趣的 enable_if 用法版本,它用于有条件地启用具有更好可读性的函数,因为该函数的返回类型不是 enable_if 的一部分(请参阅 cleaner_usage):

#include <type_traits>

using maybe_integral = int /* = or float -- then won't compile */;
using return_type = int;

typename std::enable_if<std::is_integral<maybe_integral>::value, return_type>::type
traditional_usage()
{
return 1;
}

template<typename std::enable_if<std::is_integral<maybe_integral>::value, int>::type = 0>
return_type cleaner_usage()
{
return 2;
}

int main()
{
return traditional_usage() + cleaner_usage();
}

对于失败情况,机制很明确(没有type 成员)。

但它在其他情况下究竟如何运作?因为它看起来像 int typedef 字段被替换为具有意外赋值的模板类型参数。

最佳答案

在成功案例中:

template<typename std::enable_if<std::is_integral<float>::value, int>::type = 0>
return_type cleaner_usage()
{
return 2;
}

将等同于:

template<int = 0>
return_type cleaner_usage()
{
return 2;
}

这是完全合法的,因为允许某些值类型出现在模板参数上下文中。我相信这些被正式称为非类型模板参数,如 §14.1/4 所述:

A non-type template-parameter shall have one of the following (optionally cv-qualified) types:

  • integral or enumeration type,
  • pointer to object or pointer to function,
  • lvalue reference to object or lvalue reference to function,
  • pointer to member,
  • std::nullptr_t.

关于c++ - enable_if 用于没有返回类型的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32235396/

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