我正在尝试通过“C++ 方式”来学习 C++。我正在编写一个程序,其中我拥有所有这些已知值(在编译时)。这是我的问题:
在我的构造函数中,我想检查传递的值(int)是否是 2、4、8、16 或 32 之一,否则会抛出错误。我想过:
- 制作一个 C 风格的数组或整数
- 之前手动创建一个 vector 并通过它进行交互以检查
- 列出 list ?不过,我以前从未使用过列表。
我真正想做的是在单独的头文件中创建一个 const vector ,但这似乎不可能。
做这个检查最优雅的方法是什么?
同样,是否有任何方法可以在 header 中创建一个具有一定数量的已知值(在编译时)的 vector ?如果我能做到 const std::string a_str("a string");
我不明白为什么我不能对 vector 使用类似的技术。
最佳答案
有什么问题:
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/