仅键入扣除模板

时间:2017-07-09 22:23:27

标签: c++ templates type-deduction

我有一个像这样定义的函数模板:

// #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

当尝试进行第一次调用时,我得到一个模糊的函数调用错误。

有没有办法实现这个目标?

1 个答案:

答案 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。
使用隐式推理调用函数使用默认参数,仍然可以正常工作。