基本用法
对于泛型模板的声明,typename
和class
的作用一样,都是为了说明模板类型。
template <typename T, class C>
void fun(T t, C c); // 这里的T和C是等价的
与class的区别
https://stackoverflow.com/questions/2023977/difference-of-keywords-typename-and-class-in-templates
需要使用的类型需要依靠泛型模板的时候,此时需要typename
进行显式说明。
代码实例:
template <class F>
void fun(F f) {using return_type = typename std::result_of<F()>::type;/*''''''*/
}
上述的函数是一个泛型的函数模板,如果需要使用到F
的返回类型,就要靠上面这种说明方式。一个更具体的例子,在C++11的多线程中,如果使用std::future
,那么泛型的效果更加明显。
template <class F>
auto getRes() -> std::future<typename std::result_of<F()>::type>
{
// 这个函数返回一个泛型的std::future类型,但是该类型依赖于泛型函数F的返回值,所以使用typename的方式
}