gpt4 book ai didi

c++ - 禁止自动类型推断

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

我有以下演示代码:

template <int i, typename T, typename U>
T func(const U &t){return i * t;}

template <int i, typename T>
T func(const T &t){return 2 * i * t;}

int main()
{
return func<1, int>(1);
}

这是我真实代码的精简版,所以它看起来没什么用,但应该足以说明问题了:

In function ‘int main()’:                                                  
11:23: error: call of overloaded ‘func(int)’ is ambiguous
11:23: note: candidates are:
2:3: note: T func(const U&) [with int i = 1, T = int, U = int]
5:3: note: T func(const T&) [with int i = 1, T = int]

所以很明显,自动类型推断(对于模板参数 U)干扰了我选择正确版本的模板函数(只有 2 个参数的那个)的兴趣

我需要两个版本都有一个基本模板和一个专用模板,它们的功能略有不同。

所以问题是:此时是否有可能告诉编译器不要自动推断类型(例如通过某种方式说:采用只有 2 个参数的模板)?

最佳答案

您不能禁用类型推断,但您可以使用 SFINAE 来抑制其中一种重载:

template <int N, typename T, typename U>
typename std::enable_if< !std::is_same<T,U>::value, T >::type
func( const U & t ) {
return i*t;
}

这基本上创建了一个模板函数,如果推断类型 U 是类型 T,则替换将失败,此时 SFINAE 将从潜在的候选人和另一个模板将被挑选出来。

如果您没有启用 C++11 的编译器,enable_ifis_same 模板编写起来很简单...只需谷歌搜索或删除评论。

关于c++ - 禁止自动类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945344/

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