为什么下面的程序没有 select 与第一个模板参数相同类型的参数?

Why does the following program not select the argument of the same type as the first template parameter?

我正在尝试编写一个函数,使得 f<T>(args..) returns 第一个参数类型为 T

下面的程序似乎总是select第一个专业化因此打印97'a'的ASCII码)。尽管第二个不需要将 char 转换为 int。有人可以解释这种行为吗?

我是 SFINAE 和元编程的新手。

  #include <iostream>
  using namespace std;

  template <typename T, typename ...Ts>
  T f(T a, Ts... args) {
    return a;
  }

  template <typename R, typename T, typename ...Ts>
  R f(typename enable_if<!is_same<R, T>::value, T>::type a, Ts... args) {
    return f<R>(args...);
  }

  int main() {
    cout << f<int>('a', 12);
  }

std::enable_if 的第二个模板参数应该是 R,这是您想要的。

以下应该有效

 template < typename R, typename T, typename ...Ts>
 typename enable_if<!is_same<R, T>::value, R>::type f(T const& t, Ts&&... args) 
 //                                       ^^^         ^^^^^^^^^^^
 {
       return f<R>(std::forward<Ts>(args)...); // forward the args further
 }

您的代码的第一个函数参数处于非推导上下文中。 enable_if< expr, T >::type 无法 推导出 T。它位于 "non-deduced context".

无法推导Tfoo<int>( 7 )无法使用该重载;编译器不知道 T 是什么。 foo<int,int>(7) 会调用它。

  template <typename R, typename T, typename ...Ts>
  typename enable_if<!is_same<R, T>::value, R>::type f(T a, Ts... args) 

现在T处于推导上下文中。我们不是要推导 R(我们也不能从 return 类型推导)。