std ::已知序列的载体

dev*_*vin 0 c++ vector

我正在尝试通过"C++方式"来做所有事情来学习C++.我正在编写一个程序,其中包含所有这些已知值(在编译时).这是我的问题:

在我的构造函数中,我想检查传递的值(一个int)是否是2,4,8,16或32中的一个,否则抛出一个错误.我虽然说:

  1. 制作C样式数组或整数
  2. 手工创建矢量并通过它进行交互检查
  3. 列表?我之前从未使用过列表.

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

这种检查最优雅的方法是什么?

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

GMa*_*ckG 8

有什么不对:

if (!(n == 2 || n == 4 || n == 8 || n == 16 || n == 32))
{
    // no!
}
Run Code Online (Sandbox Code Playgroud)

如果你想要"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!
}
Run Code Online (Sandbox Code Playgroud)

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


Pau*_*lin 6

这有点戏法,但我相信这有效:

if (n & (n-1) != 0)
{
   // not a power of two
}
Run Code Online (Sandbox Code Playgroud)

  • hhafez:嗯,添加一个`(n> 32)`比较是微不足道的. (2认同)