У меня есть группа типов, у которых есть имя. (У них больше возможностей, но для этого обсуждения важно только имя.) Эти типы и их имена настраиваются во время компиляции с помощью макроса:
#define DEFINE_FOO(Foo_) \
struct Foo_ : public foo_base<Foo_> { \
static char const* name() {return #Foo_;} \
}
Затем типы объединяются в списки времени компиляции (классические простые рекурсивные списки времени компиляции), из которых мне нужно создать имя списка, объединив имена его объектов:
template<class Foo, class Tail = nil>
struct foo_list {
static std::string name_list() {return Foo::name() + "-" + Tail::name();}
};
template<class Foo>
struct foo_list<Foo,nil> {
static std::string name_list() {return Foo::name();}
};
Код здесь сводится к тому, что он может содержать ошибки, но на практике это работает очень хорошо.
За исключением того, что он создает и затем копирует довольно длинные строки во время выполнения, которые представляют типы, которые на самом деле хорошо известны во время компиляции. Поскольку это довольно чувствительная к производительности часть кода, которая работает на встроенных устройствах, я бы хотел изменить это, чтобы
- строка списка идеально создается во время компиляции или, если нет способа сделать это, один раз во время выполнения и
- Мне нужно только скопировать указатель на строку C, так как, согласно # 1, строки фиксируются в памяти.
- Это компиляция с С++ 03, с которой мы застряли прямо сейчас.
Как я могу это сделать?
(В случае, если это расширит арсенал грязных трюков, которые можно использовать для этого: Имена объектов foo
создаются и считываются только кодом, и ожидается, что строки имен foo_list
будут доступны для человека. )