我正在尝试通过"C++方式"来做所有事情来学习C++.我正在编写一个程序,其中包含所有这些已知值(在编译时).这是我的问题:
在我的构造函数中,我想检查传递的值(一个int)是否是2,4,8,16或32中的一个,否则抛出一个错误.我虽然说:
我真正想要做的是在一个单独的头文件中创建一个const向量,但这似乎不可能.
这种检查最优雅的方法是什么?
此外,类似地是否有任何方法可以在标题中生成具有设定数量的已知值(在编译时)的向量?如果我能做到,const std::string a_str("a string");
我不明白为什么我不能对矢量使用类似的技术.
有什么不对:
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)
修改此列表很简单,我猜测编译器可能会将此优化为我之前的答案.
这有点戏法,但我相信这有效:
if (n & (n-1) != 0)
{
// not a power of two
}
Run Code Online (Sandbox Code Playgroud)