我正在编写一些具有大量相当简单的对象的代码,我希望它们能够在编译时创建。我认为编译器能够做到这一点,但我无法弄清楚如何。
在 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;
}
}
我只是看不到编译器在编译时没有完全实例化这些对象的信息,所以我假设我遗漏了一些东西。
答案 0 :(得分:6)
在C ++ 2011中,您可以在编译时创建对象。为此,您需要使各种事物成为常量表达式:
constexpr
。constexpr
。请注意,几乎所有const
限定符都不相关或位置错误。下面是一个带有各种更正的示例,并且实际上还证明了list
数组在编译期间被初始化(通过使用它来定义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";
}
}