模板参数冲突:为什么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() { }
很明显,两个模板都具有相同的类型 template
为了解决这个问题,我们可以将第二个参数更改为具有依赖类型的指针类型:
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中文网其他相关文章!