gpt4 book ai didi

c++ - 基于 SFINAE 的重载冲突

转载 作者:行者123 更新时间:2023-11-30 03:22:09 25 4
gpt4 key购买 nike

<分区>

#include <type_traits>

struct A {};

template <class T, class = std::enable_if_t<std::is_same_v<T, A>>>
void foo(T t) {}

template <class T, class = std::enable_if_t<!std::is_same_v<T, A>>>
void foo(T t) {}

int main()
{
foo(A{});
foo(0);
return 0;
}

我看到 foo() 的第二个定义存在编译错误:

test.cpp:9:6: error: redefinition of ‘template<class T, class> void foo(T)’

看起来这是因为 SFINAE 解析发生在后期阶段。

作为一种解决方法,我可以向第二个 foo() 添加一个模板参数通过将其更改为:

template <class T, class = std::enable_if_t<!std::is_same_v<T, A>>, class = void>
void foo(T t) {}

然后错误消失了。但我想知道是否有更惯用的方法来处理这种冲突的重载?对于两个重载,添加一个额外的虚拟模板参数就足够了,但如果我们有很多这样的重载,那么代码会变得更加困惑,而且这些额外参数的用途乍一看对读者来说并不明确。

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