Я, вероятно, пытаюсь достичь невозможного, но StackExchange всегда меня удивляет, поэтому, пожалуйста, пройдите по этому адресу:Возможно ли сопоставление времени между строками во время компиляции?
Мне нужно нанести имя имени на целое число. Имена (около 2k) уникальны. В этот список не будет никаких добавлений и исключений, и значения во время выполнения не изменятся.
Реализуя их как переменные const int
, дает мне проверку времени на компиляцию для существования и типа. Также это очень ясный и подробный код. Ошибки легко обнаруживаются.
Реализация их как std::map<std::string, int>
дает мне большую гибкость при построении имен для поиска с помощью строковых манипуляций. Я могу использовать это, чтобы предоставить строки в качестве параметров для функций, которые могут запрашивать список для нескольких значений, добавляя префикс/суффиксы к этой строке. Я также могу перебрать несколько значений, создав цифровую часть имени ключа из переменной цикла.
Теперь мой вопрос: существует ли способ сочетания обоих преимуществ? Отсутствующая проверка времени компиляции (особенно для ключевого существования) почти убивает второй метод для меня. (Особенно, поскольку std::map
молча возвращает 0
, если ключ не существует, что затрудняет поиск ошибок.) Но возможности добавления циклов и префикса/суффикса настолько полезны.
Я бы предпочел решение, которое не использует никаких дополнительных библиотек, таких как boost, но, пожалуйста, предложите им, тем не менее, так как я мог бы их повторно реализовать.
Пример того, что я делаю с картой:
void init(std::map<std::string, int> &labels)
{
labels.insert(std::make_pair("Bob1" , 45));
labels.insert(std::make_pair("Bob2" , 8758));
labels.insert(std::make_pair("Bob3" , 436));
labels.insert(std::make_pair("Alice_first" , 9224));
labels.insert(std::make_pair("Alice_last" , 3510));
}
int main()
{
std::map<std::string, int> labels;
init(labels);
for (int i=1; i<=3; i++)
{
std::stringstream key;
key << "Bob" << i;
doSomething(labels[key.str()]);
}
checkName("Alice");
}
void checkName(std::string name)
{
std::stringstream key1,key2;
key1 << name << "_first";
key2 << name << "_last";
doFirstToLast(labels[key1.str()], labels[key2.str()]);
}
Другая цель состоит в том, что код, показанный в main()
рутинных пребывания, как легко и многословен, насколько это возможно. (Требуется понять не программистов.) Функция init()
будет сгенерирована кодом некоторыми инструментами. Функции doSomething(int)
фиксированы, но я могу писать вокруг них обертки. Помощники вроде checkName()
могут быть более сложными, но их нужно легко отлаживать.
Это звучит, как вы хотите, чтобы построить строки во время выполнения, но как-то это проверяется во время компиляции? –
Есть способы конвертировать перечисления в соответствующие строки, поэтому это должно быть возможно. Хотя трудно понять, как это время компиляции, если вы создаете строки во время выполнения –
'std :: map', безусловно, имеет возможность сказать вы вставили ли элемент. Один из способов - «вставить». – chris