Динамическое хранение внутренней конфигурации - PullRequest
1 голос
/ 13 января 2011

Я думал о The Right Way (R) для хранения внутренней конфигурации моей программы.

Вот подробности:

  • Конфигурация только во время выполнения, поэтому генерируется при каждом запуске.
  • Его можно адаптировать (и следует) с помощью директив в файле "проекта" (чтение этого файла не входит в сферу данного вопроса)
  • Он должен быть расширяемым, т.е.должен быть способ добавления новых «переменных» с присваиваемыми значениями.

Мои вопросы по этому поводу:

  1. Как мне начать с этого?Является ли класс с аксессорами и сеттерами с внутренним std::map для пользовательских переменных хорошим вариантом?
  2. Существуют ли известные и "хорошие" способы сделать это?
  3. Должна ли быть разницамежду целочисленными, логическими и строковыми переменными?
  4. Должна ли вообще существовать разница между пользовательскими и встроенными (уже существующими, как я уже думал о них) переменными?

Спасибо!

PS: Если вопрос не ясен, не стесняйтесь спрашивать дополнительную информацию.

ОБНОВЛЕНИЕ : Ничего себе, каждый ответ, кажется, косвенно илиявно используется буст.Я должен был упомянуть, что хотел бы избежать повышения (я хочу изучить возможности Стандартных библиотек как есть).

Ответы [ 3 ]

3 голосов
/ 13 января 2011

Вы можете использовать для этого Boost.PropertyTree .

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

1 голос
/ 13 января 2011

Вы можете сделать хуже, чем какую-то карту свойств (StringMap это просто typedef'd std :: map)

class PropertyMap
{
private:
    StringMap m_Map;

public:
    PropertyMap() { };
            ~PropertyMap() { };

    // properties
    template<class T>
    T get(const String& _key, const T& _default = T()) const
    {
        StringMap_cit cit(m_Map.find(_key));
        return (cit != m_Map.end()) ? boost::lexical_cast<T>(cit->second) : _default;
    };  // eo get

    // methods
    void set(const String& _cap, const String& _value)
    { 
        m_Map[_cap] = _value;
    };  // eo set

    template<class T>
    void set(const String& _key, const T& _val)
    {
        set(_key, boost::lexical_cast<String>(_val));
    };  // eo set
};
0 голосов
/ 13 января 2011

Очень полезно поддерживать вложение в конфигурационных файлах. Что-то вроде JSON .

Поскольку значения параметров могут быть скалярами, массивами и вложенными группами параметров, они могут храниться в std::map из boost::variant, чье значение может быть рекурсивным скаляром, массивом или другим std::map. Обратите внимание, что std::map сортирует по имени, поэтому, если важен исходный порядок параметров в конфигурационном файле, также должен быть последовательный индекс параметров. Это может быть достигнуто с помощью boost::multi_index с упорядоченным или хешированным индексом для быстрого поиска и последовательным индексом для обхода параметров в исходном порядке файла конфигурации.

Я не проверял, что карта свойств повышения может сделать это из того, что я слышал.

Можно хранить все значения в виде строк (или массивов строк для значений массива), преобразовывая их в тип назначения только при обращении к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...