首页  >  文章  >  后端开发  >  为什么函数定义中 `enable_if_t` 失败?

为什么函数定义中 `enable_if_t` 失败?

DDD
DDD原创
2024-11-18 03:21:02263浏览

Why Does `enable_if_t` Fail in Function Definitions?

模板参数冲突:为什么enable_if_t在定义中失败

在模板编程中,经常会遇到需要有条件启用的情况或根据特定条件禁用模板功能。在这种情况下,通常使用 std::enable_if 模板来实现此目的。然而,最近尝试使用 std::enable_if_t 的新语法导致了意外错误。

在下面的代码片段中,我们使用 std::enable_if:

定义了两个模板函数 f()
template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }

移植此代码以使用新的 std::enable_if_t 语法时,我们遇到一个问题:

template<typename T,
         typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }

GCC 抱怨以下错误:

error: redefinition of 'template<class T, class> void g()'
       void g() { }

为了理解为什么会出现这个错误,我们需要检查模板参数的语法。删除不必要的代码,我们的函数得到以下简化表示:

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<int, T>::value>*/
>
void g() { }

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<double, T>::value>*/
>
void g() { }

很明显,两个模板都具有相同的类型 templatevoid(),无论它们的默认值如何不同对于第二个类型参数。这与 C 要求相同模板类型的两个模板函数需要具有不同签名的要求相冲突。

为了解决这个问题,我们可以将第二个参数更改为具有依赖类型的指针类型:

template<
  class T,
  std::enable_if_t<std::is_same<int, T>::value, int>* = nullptr
>
void f() { }

template<
  class T,
  std::enable_if_t<std::is_same<double, T>::value, int>* = nullptr
>
void f() { }

在此修改后的代码中,模板函数的签名现在是唯一的,消除了冲突并允许正确的模板匹配。

以上是为什么函数定义中 `enable_if_t` 失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn