У меня есть несколько стандартных наборов целых чисел, к которым мне нужно иметь доступ из нескольких единиц перевода. Цель состоит в том, чтобы взять эти стандартные наборы и поместить их в локальные наборы в зависимости от контекста кода.
Например, лучшее решение, которое у меня есть:
#include <boost/assign/list_of.hpp>
#include <set>
const std::set<int> set9 =
boost::assign::list_of(4)(10)(108);
const std::set<int> set10 =
boost::assign::list_of(3)(5)(10)(108);
const std::set<int> set11 =
boost::assign::list_of(2)(3)(5)(101);
int main(void)
{
std::set<int> my_set(set9);
my_set.insert(set11.begin(), set11.end());
return 0;
}
Они не обязательно должны быть константными глобальными переменными, на самом деле, я бы предпочел функции, но если бы они были функциями, мне пришлось бы добавлять дополнительную строку и дополнительную переменную set каждый раз, когда я хотел бы использовать более одного.
Это будет выглядеть примерно так (с еще одним стандартным набором, чем раньше):
std::set<int> my_set(get_set9());
std::set<int> extra_line(get_set11());
my_set.insert(extra_line.begin(), extra_line.end());
std::set<int> another_extra_line(get_set12());
my_set.insert(another_extra_line.begin(), another_extra_line.end());
Если я что-то упустил?
Причина, по которой я бы предпочел функции, заключается в том, что есть дополнительная сложность. Среди наборов констант есть повторяющиеся значения со связанными значениями, так что я не хочу повторять их каждый раз в случае изменения (и для предотвращения дублирования кода).
В моем предыдущем примере скажем, что 10 и 108 связаны и должны всегда появляться вместе. Если бы это были функции, я бы просто использовал get_set11 () и get_set12 () для вызова общей функции (например, get_set2 (), которая имеет только 10 и 108). Однако, с подходом постоянных наборов я не уверен, как построить эти постоянные наборы, содержащие другие наборы. Лучшее, что я придумал, это:
#include <boost/assign/list_of.hpp>
#include <set>
#define APPLY_COMMON_SET(prev) \
prev(10)(8)
const std::set<int> set2 =
APPLY_COMMON_SET(boost::assign::list_of);
const std::set<int> set9 =
APPLY_COMMON_SET(boost::assign::list_of(4));
const std::set<int> set10 =
APPLY_COMMON_SET(boost::assign::list_of(3)(5));
const std::set<int> set11 =
boost::assign::list_of(2)(3)(5)(101);
#undef APPLY_COMMON_SET
int main(void)
{
std::set<int> my_set(set9);
my_set.insert(set11.begin(), set11.end());
return 0;
}
Что работает, но я бы предпочел избегать макроса препроцессора.
Это не компилируется, но я хотел бы иметь возможность сделать что-то вроде этого:
const std::set<int> set2 =
boost::assign::list_of(10)(108)
const std::set<int> set9 =
boost::assign::list_of(4) + set2;
const std::set<int> set10 =
boost::assign::list_of(3)(5) + set2;
Есть ли способ сделать это без макросов, или это мой единственный выбор?