【问题标题】:Nontype Template Array非类型模板数组
【发布时间】:2020-07-03 09:01:21
【问题描述】:

是否可以将数组作为非类型模板参数传递?

例如

template<typename T, T> struct s;

template<typename T, size_t S, T A[S]> struct s<T[S], A>
{ };

【问题讨论】:

    标签: c++ c++17 language-lawyer


    【解决方案1】:

    是的,有可能,这是一个在 C++11 及更高版本中有效的示例:

    #include <cstddef>
    
    template<typename T, size_t S, T A[S]>
    struct s
    {
        static constexpr auto x = A[1];
    };
    
    static constexpr int a[3] = {10,20,30};
    
    int f()
    {
        return s<const int, 3, a>::x;
    }
    

    f() 返回 20,如下所示:https://godbolt.org/z/GggQd9

    有关参考,请参阅the draft C++17 standard §17.1.4.2 [temp.param]:

    非类型模板参数应具有以下类型之一(可选 cv 限定):

    • 指向对象的指针或指向函数的指针,

    以及§17.1.4.8:

    将类型为“T 数组”或函数类型 T 的非类型模板参数调整为“指向 T 的指针”类型

    最终结果是你的T A[S]声明等同于T* A,并且允许指向对象的指针,并且数组是对象,所以代码是有效的。

    【讨论】:

    • 请注意language-lawyer标签。
    • @superdeveloper:现在够律师吗?
    • 您能评论一下将字符串文字作为模板参数的能力吗?我知道这超出了问题的范围
    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多