C++模板知识点6『拆分模板参数』
1、为什么要拆分模板参数?
如下代码试图遍历数组,但很显然是错误的:
template<typename T>
void funcArray(T &arr) {int size = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < size; ++i) {qDebug() << arr[i];}
}
拆分模板参数的目的,是为了获得更多模板参数的信息,包括参数类型和参数数量,如下:
// 数组拆分,获得数组元素类型和数量
template<typename T, int N>
void funcArray(T(&arr)[N]) {for (int i = 0; i < N; ++i) {qDebug() << arr[i];}
}
C++STL标准库提供的vector则可以拆分其元素类型,其元素数量由vector.size函数即可获得,如下:
template<typename T>
void funcArray(std::vector<T> vec) {for (int i = 0; i < vec.size(); ++i) {qDebug() << vec[i];}
}
其他拆分的示例如下:
// 函数指针拆分,获得函数返回值类型、参数类型和数量
template<typename R, typename... Args>
void function1(R(*f)(Args...), Args... args) {f(args...);
}// 函数对象拆分,获得函数返回值类型、参数类型和数量
template<typename R, typename... Args>
void function2(std::function<R(Args...)> f, Args... args) {f(args...);
}// 成员函数指针拆分,获得函数返回值类型、参数类型和数量,还有类/结构的类型
template<typename R, typename S, typename... Args>
void function3(R(S::*f)(Args...), S *s, Args... args) {(s->*f)(args...);
}