为什么下面的程序没有 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".
无法推导T
,foo<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 类型推导)。
我正在尝试编写一个函数,使得 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".
无法推导T
,foo<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 类型推导)。