Я не думаю, что между вашими требованиями должен быть конфликт: (1) обеспечения безопасного доступа к переменным конфигурации; и (2) использование синтаксиса "fully.scoped.name"
для указания имени переменной конфигурации. Конечно, у вас могут быть безопасные операции, такие как:
const char * getString(const char * fullyScopedName);
int getInt(const char * fullyScopedName);
bool getBool(const char * fullyScopedName);
Вы можете найти вдохновение, прочитав главы 2 и 3 Руководства по началу работы ( PDF , HTML ) для моего Config4Cpp библиотека.
Редактировать : упомянутая мною документация Config4Cpp может послужить источником вдохновения для разработки API, но я запоздало понял, что вы могли бы по достоинству оценить советы по вариантам реализации, если вы решите написать собственный класс конфигурации с нуля (а не использовать стороннюю библиотеку, например Config4Cpp) ...
Ваш класс должен использовать std::map
для хранения коллекции отображений fullScopedName-> value . Очевидно, что fullScopedName будет строкой, но есть два варианта представления значения .
.
Первый вариант - представить значение в виде строки. Типобезопасный метод доступа, такой как getInt()
или getBool()
, извлечет строковое значение из карты, а затем проанализирует его, чтобы преобразовать его в нужный тип. Если синтаксический анализ завершается неудачно, то операция доступа вызывает исключение. (Это подход, принятый Config4Cpp.)
Второй вариант должен представлять значение , как показано в псевдокоде ниже:
enum ValueType { STRING_VAL, INT_VAL, BOOL_VAL };
struct Value {
ValueType type;
union {
const char * stringVal;
int intVal;
bool boolVal;
} data;
};
Реализация безопасного типа доступа может быть затем закодирована следующим образом (псевдокод):
int getInt(const char * fullyScopedName)
{
Value * v = nameValueMap[fullyScopedName];
if (v->type != INT_VAL) {
throw WrongTypeException(...);
}
return v->data.intVal;
}