3

非常に多数の合理的に単純なオブジェクトを含むコードを書いており、コンパイル時にそれらを作成したいと考えています。コンパイラでこれを行うことができると思いますが、その方法を理解できませんでした。

Cでは、次のことができます。

#include <stdio.h>

typedef struct data_s {
    int a;
    int b;
    char *c;
} info;

info list[] = {
    1, 2, "a",
    3, 4, "b",
};

main()
{
   int i;
   for (i = 0; i < sizeof(list)/sizeof(*list); i++) {
     printf("%d %s\n", i, list[i].c);
   }
}

#C++* を使用すると、各オブジェクトは単にメモリー内に配置されるのではなく、コンストラクターが呼び出されます。

#include <iostream>
using std::cout;
using std::endl;

class Info {
    const int a;
    const int b;
    const char *c;
public:
    Info(const int, const int, const char *);
    const int get_a() { return a; };
    const int get_b() { return b; };
    const char *get_c() const { return c; };
};

Info::Info(const int a, const int b, const char *c) : a(a), b(b), c(c) {};

Info list[] = {
    Info(1, 2, "a"),
    Info(3, 4, "b"),
};

main()
{
    for (int i = 0; i < sizeof(list)/sizeof(*list); i++) {
        cout << i << " " << list[i].get_c() << endl;
    }
}

コンパイラがコンパイル時にこれらのオブジェクトを完全にインスタンス化するために利用できない情報がわからないので、何かが欠けていると思います。

4

1 に答える 1

8

C++ 2011 では、コンパイル時にオブジェクトを作成できます。ただし、これを行うには、さまざまなものを定数式にする必要があります。

  1. コンストラクターを宣言する必要がありますconstexpr
  2. 宣言するエンティティは宣言する必要がありますconstexpr

constほとんどすべての修飾子が無関係であるか、間違った場所にあることに注意してください。これは、さまざまな修正を加えた例であり、listコンパイル時に配列が初期化されることも実際に示しています (配列のメンバーを使用して an の値を定義することによってenum)。

#include <iostream>
#include <iterator>

class Info {
    int a;
    int b;
    char const*c;

public:
    constexpr Info(int, int, char const*);
    constexpr int get_a() const { return a; }
    constexpr int get_b() const { return b; }
    constexpr char const*get_c() const { return c; }
};

constexpr Info::Info(int a, int b, char const*c)
  : a(a), b(b), c(c) {}

constexpr Info list[] = {
    Info(1, 2, "a"),
    Info(3, 4, "b"),
};

enum {
    b0 = list[0].get_b(),
    b1 = list[1].get_b()
};

int main()
{
    std::cout << "b0=" << b0 << " b1=" << b1 << "\n";
    for (Info const* it(list), *end(list); it != end; ++it) {
        std::cout << (it - list) << " " << it->get_c() << "\n";
    }
}
于 2012-09-17T06:26:18.223 に答える