具有隐式数组大小的模板参数

时间:2018-01-13 15:46:08

标签: c++ arrays templates c++17

下面是一个简化的模板类,它接受一个数组作为模板参数。但是我必须将数组的大小作为参数传递。我想自动推断它并写下:

const char *TextArray[] = { "zero", "one", "two" };

Array<TextArray> a;

在实际实现中,类在编译时知道TextArray的大小,这是必需的(因为在编译器时它会被检查并与类中的其他项配对)。如果我指定了错误的大小,我会得到正确的编译器错误:

Array<100, TextArray> a;

课程定义:

#include <iostream>

template <std::size_t N, const char * (&A)[N]>
class Array
{
public:
    auto getCount()
    {
        return N;
    }
    auto getAt(std::size_t n)
    {
        return A[n];
    }
};


const char *TextArray[] = { "zero", "one", "two" };

int main() {
    Array<sizeof(TextArray)/sizeof(TextArray[0]), TextArray> a;

    printf("a.getCount() is %zu\n", a.getCount());
    printf("a.getAt(1) is %s\n", a.getAt(1));
}

输出:

  

a.getCount()是3

     

a.getAt(1)是一个

解决方案是使用宏,但我不想污染全局范围。一个微不足道的改进是更新类,以便我写:

Array<sizeof(TextArray), TextArray> a;

在gcc上使用C ++ 17,Visual Studio,clang

1 个答案:

答案 0 :(得分:3)

从C ++ 17开始,您可以使用auto in template parameter,例如

template <auto &A>
class Array
{
public:
    auto getCount()
    {
        return std::size(A); // also C++17 feature, #include <iterator>
    }
    auto getAt(std::size_t n)
    {
        return A[n];
    }
};

顺便说一句,您最好明确地将a.getCount()投射到unsigned以匹配%u说明符。