我想使用constexpr填充一个枚举数组.阵列的内容遵循某种模式.
我有一个枚举将ASCII字符集分为四类.
enum Type {
Alphabet,
Number,
Symbol,
Other,
};
constexpr Type table[128] = /* blah blah */;
Run Code Online (Sandbox Code Playgroud)
我想有一个128的数组Type.它们可以是一个结构.数组的索引将对应于ASCII字符,值将是Type每个字符的值.
所以我可以查询这个数组,找出ASCII字符属于哪个类别.就像是
char c = RandomFunction();
if (table[c] == Alphabet)
DoSomething();
Run Code Online (Sandbox Code Playgroud)
我想知道如果没有一些冗长的宏观黑客,这是否可行.
目前,我通过执行以下操作来初始化表.
constexpr bool IsAlphabet (char c) {
return ((c >= 0x41 && c <= 0x5A) ||
(c >= 0x61 && c <= 0x7A));
}
constexpr bool IsNumber (char c) { /* blah blah */ }
constexpr bool IsSymbol (char c) { /* blah blah */ } …Run Code Online (Sandbox Code Playgroud) 我有一个类来表示浮动的3D矢量:
class Vector3D
{
public:
float x, y, z;
float * const data;
Vector3D() : x(0.0), y(0.0), z(0.0), data(&x) {}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:x,y和z是否会在内存中顺序分配,这样我就可以将x的地址分配给数据,然后使用数据上的下标运算符来作为数组访问矢量组件?
例如,有时我可能想直接访问矢量组件:
Vector3D vec;
vec.x = 42.0;
vec.y = 42.0;
vec.z = 42.0;
Run Code Online (Sandbox Code Playgroud)
有时我可能想通过偏移来访问它们:
Vector3D vec;
for (int i = 3; i--; )
vec.data[i] = 42.0;
Run Code Online (Sandbox Code Playgroud)
第二个示例是否与第一个示例具有相同的效果,或者我是否存在覆盖除x,y和z浮点数以外的内存的风险?
我曾经编写过一些代码,在编译时为一些模板元编程生成一个静态表/数组(想法是C样式的字符串可以在编译时构建(它们只是char数组)).这个想法和代码是基于David Lin的回答:
#include <iostream>
const int ARRAY_SIZE = 5;
template <int N, int I=N-1>
class Table : public Table<N, I-1>
{
public:
static const int dummy;
};
template <int N>
class Table<N, 0>
{
public:
static const int dummy;
static int array[N];
};
template <int N, int I>
const int Table<N, I>::dummy = Table<N, 0>::array[I] = I*I + 0*Table<N, I-1>::dummy;
template <int N>
int Table<N, 0>::array[N];
template class Table<ARRAY_SIZE>;
int main(int, char**)
{
const …Run Code Online (Sandbox Code Playgroud) c++ templates partial-specialization static-members language-lawyer