在 C++ 中初始化类的静态数组成员的更好方法(虽然 const 是首选)

发布于 2024-12-14 21:38:11 字数 350 浏览 0 评论 0原文

我有一个指向函数的静态指针数组作为类的成员。

我需要初始化它,但事实证明这个数组有 64K 项长,因此使用像 { x, y, z, ... } 这样的静态初始化器来初始化它是不切实际的,因为它会混乱代码。

我必须通过代码来初始化它,并进行几个循环。

我想做到这一点的方法是在构造函数中初始化静态数组并为其设置一个标志,因此只有类的第一个实例的构造才会触发此初始化。

此外,从实例内访问此静态标志也不是线程安全的,但这是另一个故事了。

有没有更干净或更好的方法来做到这一点?

我也希望这个数组是 const,但恐怕唯一的方法是使用 static {} 初始化,对吗?

I have a static array of pointers to functions as a member of a class.

I need to initialize it, but it turns out this array is 64K items long, so it's impractical to initialize it with a static initializer like { x, y, z, ... } as it would clutter code.

I have instead to initialize it by code, with several loops.

The way I figured to do this is by initializing the static array in the constructor and setting a flag to it, so only the construction of the first instance of the class would fire this initialization.

Also accessing this static flag from within instances would not be thread safe, but that's another story.

Is there a cleaner or better way of doing this?

I also would like this array to be const, but I'm afraid the only way to do it is with the static {} initialization, right?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一紙繁鸢 2024-12-21 21:38:11

另一种选择是使用代码生成:编写一个单独的程序来生成静态数组定义的源代码。

Another option would be to use code generation: Write a separate program that generates the source code for the definition of the static array.

无人问我粥可暖 2024-12-21 21:38:11

也许不是最干净的代码,但是如何将成员数组设置为静态引用?

头文件:

class MyClass
{
    ...
    static const std::vector<pointer to member>& pointer_vector;
};

实现文件:

namespace
{
    typedef std::vector<pointer to member> t_pointer_vector;

    t_pointer_vector pointer_vector;

    const t_pointer_vector& initialize_pointer_vector(void)
    {
        //generate pointer_vector

        return pointer_vector;
    }
}

t_pointer_vecotor& MyClass::pointer_vector = initialize_pointer_vector();

如果你不需要std::vector,你可以看看std::tr1::array,一个固定的size 数组比 C 风格数组更安全且效率不低(根据 Boost 文档)。它是 TR1 的一部分。关于TR1的基本信息可以在wikipedia上找到,其Boost 下的文档

Maybe not the cleaniest code, but how about making the member array a static reference;

header file:

class MyClass
{
    ...
    static const std::vector<pointer to member>& pointer_vector;
};

implementation file:

namespace
{
    typedef std::vector<pointer to member> t_pointer_vector;

    t_pointer_vector pointer_vector;

    const t_pointer_vector& initialize_pointer_vector(void)
    {
        //generate pointer_vector

        return pointer_vector;
    }
}

t_pointer_vecotor& MyClass::pointer_vector = initialize_pointer_vector();

If you don't want std::vector, you can take a look at std::tr1::array, a fixed size array that is safer than and no less efficient than a C style array (according to Boost doc). It is a part of TR1. Basic info about TR1 can be found on wikipedia, its documentation under Boost.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文