美文网首页
C++11 模板元编程 - 模板的非类型参数

C++11 模板元编程 - 模板的非类型参数

作者: MagicBowen | 来源:发表于2016-09-14 10:09 被阅读1358次

前面的例子中,我们分别使用了类型和模板作为类模板的参数。除此之外,模板还支持非类型模板参数。

如下用数组实现Stack模板,第二个模板参数是一个int型常量,用于定义数组的最大长度。

template<typename T, int MAX_SIZE>
struct Stack
{
    void push(const T&);
    T pop();
    
private:
    T elems[MAX_SIZE];
    int size;
};

一般来说,模板的非类型参数只能是整型常量(包括enum),或者指向外部链接的指针(包括函数指针,类的成员函数指针)。到目前为止还不支持浮点数,对于字符串常量也不支持,但是可以支持具有外部链接的字符串常量指针。

例如对于下面的模板定义:

template<const char* MyName>
struct Token
{
    std::string name{MyName};
};

下面的用法都会产生编译错误:

    Token<“Hello”> tocken;
    const char* str = "Hello";
    Token<str> tocken;

而如下是可以正确编译通过的:

extern const char str[] = "Hello";

Token<str> token;
std::cout << tocken.name << std::endl;

总结一下,模板的参数支持以下类型:

  • 类型参数;
    使用typename或者class指示。

  • 非类型参数;
    整型常量(包括enum),或者指向外部链接的指针(包括函数指针、类的成员函数指针,以及具有外部链接的字符串常量指针)。

  • 模板参数;
    使用template<...> class XXX的形式指示。


模板的编译期计算

返回 C++11模板元编程 - 目录

相关文章

  • C++11 模板元编程 - 模板的类型参数

    下面是我们熟悉的类模板的例子:一个简单的容器栈,它可以支持不同的类型做元素。 它的用法如下: 对于模板元编程,我们...

  • c++11: 可变参数模板

    c++11 可变参数模板,模板函数可以表示0到任意个数、任意类型的参数。但是,要提取模板中的参数,则需要不断的展开...

  • C++11 模板元编程 - 模板的非类型参数

    前面的例子中,我们分别使用了类型和模板作为类模板的参数。除此之外,模板还支持非类型模板参数。 如下用数组实现Sta...

  • C++11 模板元编程 - 模板的模板参数

    上例中由于Stack类模板的声明中第二个参数是一个类型(typename Container),所以我们通过Sta...

  • 泛型与模版的应用

    泛型编程即以一种独立于任何特定类型的方式编写代码。 模板类型 一,模板参数 指定形式参数类型和返回参数类型, 模板...

  • C++11的可变参数模板Variadic Template

    简述 可变参数模板(Variadic Template)是C++11引入的新特性,让模板编程更容易,且在运行时更少...

  • C++11 模板元编程 - 模板的默认参数

    上面例子中,栈的实现使用了std::vector。为了让栈的实现更加灵活,我们将实现栈的容器也作为模板的参数之一。...

  • C++11 模板元编程 - 模板的类型计算

    除了可以计算数值,编译期更具有价值的是类型计算。我们可以将编译期常量和类型都看做是编译期的可计算对象。 我们知道模...

  • C++11——模版和通用编程

    将模板类型参数声明为友元 新标准下,我们可以将模板类型参数设为友元: 这里我们说,无论使用什么类型来实例化Bar,...

  • C++11 模板元编程 - 目录

    前言 模板的基础知识模板的类型参数模板的默认参数模板的模板参数模板的特化模板的非类型参数模板的编译期计算数值计算类...

网友评论

      本文标题:C++11 模板元编程 - 模板的非类型参数

      本文链接:https://www.haomeiwen.com/subject/xedvettx.html