You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
template <typename T, std::size_t Maxsize>
classStack {
private:
std::array<T, Maxsize> elems; // elements
std::size_t numElems; // current number of elementspublic:Stack(); // constructorvoidpush(T const &elem); // push elementvoidpop(); // pop element
T const &top() const; // return top elementboolempty() const { // return whether the stack is emptyreturn numElems == 0;
}
std::size_tsize() const { // return current number of elementsreturn numElems;
}
};
Stack<int,20> int20Stack; // stack of up to 20 ints
Stack<int,40> int40Stack; // stack of up to 40 ints
Stack<std::string,40> stringStack; // stack of up to 40 strings
这个很简单,就不细说了。
函数模板的非类型模板参数
template<int Val, typename T>
T addValue (T x) {
return x + Val;
}
std::transform(source.begin(), source.end(), dest.begin(), addValue<5, int>);
模板参数不一定非得是类型,它们还可以是普通的数值。我们仍然使用前面文章的Stack的例子。
类模板的非类型模板参数
声明:
实现:
使用:
这个很简单,就不细说了。
函数模板的非类型模板参数
再比如标准库
type_traits
中的enable_if
和conditional
:限制
必须是下面的类型:
当传递指针或者引用时,指向的对象不能是字符串常量、临时变量、数据成 员以及其它子对象。
使用auto推断非类型模板参数
从c++17起,可以使用auto推断非类型模板参数:
如果没有auto,想将非类型模板参数的类型也当做模板参数,那么必须声明两个模板参数:
从c++17开始,只需要一个auto即可:
在auto推导的的情况下获取类型:
或者:
template<decltype(auto) N>
也是可以的,这里N会被推断成引用类型:(完)
朋友们可以关注下我的公众号,获得最及时的更新:
The text was updated successfully, but these errors were encountered: