我正在尝试通过一切“ C ++方式”来学习C ++。我正在编写一个程序,其中具有所有这些已知值(在编译时)。这是我的问题:

在我的构造函数中,我想检查传递的值(一个int)是否为2、4、8、16或32之一,否则抛出错误。我有关于:


制作C样式数组或整数
手动创建矢量并对其进行检查
列出清单?我以前从未使用过列表。


我真正想做的是在一个单独的头文件中创建一个const向量,但这似乎是不可能的。

进行此检查的最优雅的方法是什么?

此外,类似地,是否有任何方法可以在标头中生成具有一定数量的已知值(在编译时)的向量?如果我可以做const std::string a_str("a string");,我不明白为什么不能对向量使用类似的技术。

最佳答案

有什么问题:

if (!(n == 2 || n == 4 || n == 8 || n == 16 || n == 32))
{
    // no!
}


如果要使用“ C ++方式”,则应使用find静态数组:

template <typename T, size_t N>
T* endof(T (&pArray)[N])
{
    return &pArray[0] + N;
}

static const int OkNumbers[] = {2, 4, 8, 16, 32};
static const int* OkNumbersEnd = endof(OkNumbers);
if (std::find(OkNumbers, OkNumbersEnd, n) == OkNumbersEnd)
{
    // no!
}


修改此列表很简单,我猜编译器可能会将其优化为我以前的答案。

关于c++ - std::vector的已知序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1918723/

10-11 00:56