Инициализировать вектор из hardcoded int для разных платформ

0

У меня проблема с инициализацией вектора целых чисел с именем id_vector который не нужно изменять.

инициализатор выполняется следующим образом:

static int id[4]{200,300,400,500};
id_vector = std::vector<int> (id,id + (sizeof(id)/sizeof(int)));

Все идет нормально. но теперь нам нужно иметь разные версии этого программного обеспечения, и я хотел бы выбрать другой массив id в зависимости от версии. Единственный способ, который я могу придумать, - сделать это внутри #ifdef или какого-то макроса, но мне было интересно, знает ли кто-нибудь лучший способ сделать это. Я думал что-то вроде пространства имен, но я не знаю, хорошо ли это для него.

ОБНОВИТЬ

Если бы опечатка в коде, извините. Извините, если я не сделал себя ясным, но в основном это список допустимых идентификаторов, и есть две версии, которые нуждаются в разных действительных идентификаторах. Не думайте, что нужно добавить больше кода.

  • 0
    Как можно сказать, ничего не зная о ваших средах сборки, имеют ли разные версии разные исполняемые образы (и желательно ли это или нежелательно) или просто различаются во включенных библиотеках / конфигурациях и т. Д.? Вы можете использовать пространство имен, но затем вам нужно будет использовать препроцессор, чтобы выбрать, какое пространство имен было использовано / включено. Вы можете сделать их значения во время выполнения взяты из конфигурации. Как вы говорите, ifdefs и макросы возможны. У вас может быть какая-то часть вашей системы сборки, указывающая специфический для ОС объект для связи.
  • 0
    @dasblinkenlight исправил опечатку.
Показать ещё 1 комментарий
Теги:
stdvector
stl

4 ответа

1
Лучший ответ

Пространства имен?

namespace PLATFORM_A
{
    static int id[4]{200,300,400,500};
}

namespace PLATFORM_B
{
    static int id[4]{500,400,300,200};
}

using namespace USE_PLATFORM;

...

id_vector = std::vector<int> (id,id + (sizeof(id)/sizeof(int)));

С помощью g++ -DUSE_PLATFORM=PLATFORM_A... или g++ -DUSE_PLATFORM=PLATFORM_B... или однако вы USE_PLATFORM....

  • 0
    Это ближе к тому, что я хотел. Но потом я подумал, что это также делает это немного менее очевидным.
2

Если вам нужно поместить разные значения для разных платформ, и вам нужно, чтобы изменения произошли в коде (в отличие от, скажем, файла конфигурации), вы получите #ifdef в своем коде. Вот один пример того, как вы можете это сделать:

static int id[4]{
#ifdef PLEFTORM_1
200,300,400,500
#endif
#ifdef PLEFTORM_2
100,200,410,522
#endif
};
id_vector = std::vector<int> (id,id + (sizeof(id)/sizeof(*id)));

Другое решение может состоять в том, чтобы поместить все зависящие от платформы материалы в отдельные файлы и условно включить этот файл. Это может уменьшить число #ifdef до 1, но общий код может оказаться более трудным для чтения.

Конечно, вы можете изменить свою стратегию и поместить идентификаторы платформы в файл конфигурации. Это поможет вам избежать условной компиляции за счет введения зависимости от времени выполнения файла конфигурации.

  • 0
    Это то, чего я пытался избежать ... но я думаю, для чего-то такого простого может быть путь.
0
std::vector<int> id_vector (id,id + (sizeof(id)/sizeof(int)));
0
id_vector = std::vector<int> (id, id + (sizeof(id)/sizeof(*id)));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню