8

我想知道类模板和函数模板之间的区别以及我应该在哪里使用它们。

4

2 回答 2

7

实例化后,类模板变成类,函数模板变成函数。例子:

//Defines a template for a class that can hold two
//objects.
template<typename T1, typename T2>
struct pair {
    T1 first;
    T2 second;
};

//Defines a template for a function that gives the
//minimum of two values.
template<typename T>
T min(T a, T b) {
    return a < b ? a : b;
}

对于普通代码,当你想创建一个由类型参数化的类时,你会使用类模板,当你想创建一个可以对许多不同类型进行操作的函数时,你会使用函数模板。

函数模板还可以进行类型推导,这对于创建工厂函数很有用:

//Deduces the types of T1 and T2, so
//for example, a pair<int, double> can be created
//by `make_pair(10, 1.2)`
template<typename T1, typename T2>
pair<T1, T2> make_pair(T1&& t1, T2&& t2) {
    return {std::forward<T1>(t1), std::forward<T2>(t2)};
}

类模板可用于编写在编译时执行的程序(使用类型作为值,使用模式匹配的模板实例化作为纯函数)。一个简单的例子是这组类模板,它const从一个类型中删除所有内容:

//Removes all `const` from a type, for example:
//`remove_const_recursive<int const*const volatile>::type`
//is the type `int*volatile`.
template<typename T> struct remove_const_recursive { typedef T type; };
template<typename T> struct remove_const_recursive<T const volatile> {
    typedef typename remove_const_recursive<T>::type volatile type;
};
template<typename T> struct remove_const_recursive<T volatile> {
    typedef typename remove_const_recursive<T>::type volatile type;
};
template<typename T> struct remove_const_recursive<T const> {
    typedef typename remove_const_recursive<T>::type type;
};
template<typename T> struct remove_const_recursive<T&> {
    typedef typename remove_const_recursive<T>::type& type;
};
template<typename T> struct remove_const_recursive<T*> {
    typedef typename remove_const_recursive<T>::type* type;
};

随着您越来越多地使用模板,您将意识到它们可以以多种方式使用。表达式模板允许您加速某些类型的代码或创建特定领域的语言。模板元编程和元组可用于自动编写各种繁琐的代码。您可能还意识到模板的迟钝语法以及有限的性能和语义能力意味着它们的成本并不总是被它们提供的好处所抵消。

于 2012-12-26T12:13:26.910 回答
3

函数模板试图从参数类型中推断出特化的类型。

函数模板不能部分特化,而类可以。

函数模板不能有默认模板参数,而类可以。

于 2015-05-05T09:52:46.593 回答