扣除模板参数顺序?

时间:2012-11-06 21:04:34

标签: c++ templates function-pointers

根据标准,以下内容是完善的:

// 1 : Deduced template parameter in the normal order
template<typename T, typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type>
void f(T x);

// 2 : Deduced template parameter in the inverted order
template<typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type, typename T>
void f(T x);

// 3 : Deduced template parameter before a function pointer
template<typename T>
void f(T x, void(*g)(int, int, T*));

// 4 : Deduced template parameter after a function pointer
template<typename T>
void f(void(*g)(int, int, T*), T x);

// 5 : Deduced template parameter with inversed variables
template<typename T, typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type>
void f(T1 x, T y);

// 6 : Inverted deduced parameter
template<typename T, typename T1>
void f(T1 x, T y);

在3和4的情况下,如果从变量和函数内部传递的类型不同,将选择哪种类型:函数之一,还是变量之一?

1 个答案:

答案 0 :(得分:5)

(2)格式错误,因为T在声明之前在T1的默认模板参数中使用。其余的都很好。

在(3)和(4)中,如果必须从函数参数中推导出T,那么T必须在每个使用它的地方推导出相同的类型。也就是说,如果推断它是在第一个函数参数中使用的一种类型,并推导出与在第二个函数参数中使用的类型不同的类型,则扣除失败并且使用形式不正确。

在(5)中,永远不会使用T1的默认参数 - 在使用特化时将指定实际参数,或者从函数参数{{1推导出模板参数}}

(6)没有什么特别之处:如果所有模板参数都是从函数参数中推导出来的,那么声明模板参数的顺序是无关紧要的。