我有一个像这样定义的函数模板:
// #1
template <typename R, typename T>
R func(T arg) { ... }
// #2
template <typename T>
T func(T arg) { ... }
我希望编译器总是扣除类型T,以便:
func<int>(my_var); // calls #1
func(my_var); // calls #2
当尝试进行第一次调用时,我得到一个模糊的函数调用错误。
有没有办法实现这个目标?
答案 0 :(得分:1)
这不会得到任何优雅奖,但是......
// #1
template <typename R, typename T>
R func(T) { /* ... */ }
// #2
template <int = 0, typename T>
T func(T) { /* ... */ }
调用func<int>(4)
会尝试为#2
的非类型参数提供类型参数,因此它已离开SFINAE。
使用隐式推理调用函数使用默认参数,仍然可以正常工作。