gpt4 book ai didi

c++ - 我可以消除重载模板函数与更受约束的模板函数之间的歧义吗?

转载 作者:可可西里 更新时间:2023-11-01 18:04:23 24 4
gpt4 key购买 nike

代码

#include <iostream>
#include <type_traits>

template<typename T,
typename = typename std::enable_if<std::is_pod<T>::value>::type
>
T foo(T t) { return t; }

template<typename T>
void foo(T t) { }

int main()
{
foo<int>(5);
}

错误

main.cpp: In function 'int main()':
main.cpp:14:15: error: call of overloaded 'foo(int)' is ambiguous
foo<int>(5);
^
main.cpp:14:15: note: candidates are:
main.cpp:7:3: note: T foo(T) [with T = int; <template-parameter-1-2> = void]
T foo(T t) { return t; }
^
main.cpp:10:6: note: void foo(T) [with T = int]
void foo(T t) { }
^

问题

是否有可能解决代码中的错误?

最佳答案

使用 SFINAE 约束函数不引入顺序,它仅表示受约束的函数可调用或不可调用,因此当启用第一个重载时,您有两个不明确的函数。

最简单的解决方案是使用相同约束的逆来禁用第二个重载,以便给定类型只有一个可行。要实现这一点,您需要将 enable_if 移动到返回类型,而不是默认模板参数(因为默认模板参数不是函数签名的一部分,因此不能用于重载,仅受 SFINAE 约束)。该解决方案不适用于大量重载,除非您可以为每个重载提出一个单独的谓词(即类型特征的组合),这样没有一个参数类型匹配超过一个谓词。这意味着谓词必须是互斥的,您不能让一个谓词测试一个概念,例如 signed integral type,它是另一个测试诸如 integral type ,因为对于 int,两个谓词都为真,并且将启用多个函数。

C++ 概念是比 SFINAE 更好的解决方案的一个重要原因是受概念约束的函数是有序的,因此受约束较多的函数比受约束较少的函数更匹配。这意味着您不需要玩这些 SFINAE 游戏并且有互斥约束,编译器会做正确的事。

关于c++ - 我可以消除重载模板函数与更受约束的模板函数之间的歧义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25548045/

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