下面是一个简化的模板类,它接受一个数组作为模板参数。但是我必须将数组的大小作为参数传递。我想自动推断它并写下:
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
答案 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
说明符。