相关疑难解决方法(0)

在编译时使用Constexpr填充数组

我想使用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)

c++ templates constexpr c++11

20
推荐指数
3
解决办法
1万
查看次数

查询C++中的类变量声明

我有一个类来表示浮动的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++ arrays variables subscript memory-address

5
推荐指数
1
解决办法
511
查看次数

静态表生成与GCC一起使用但不是clang; 铿锵叫?

我曾经编写过一些代码,在编译时为一些模板元编程生成一个静态表/数组(想法是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

5
推荐指数
1
解决办法
239
查看次数