Автоматический тип в дереве свойств Boost - PullRequest
0 голосов
/ 15 октября 2011

В настоящее время у меня есть этот код:

if(!variables["width"].defaulted())
{
    configTree.put(treeNames["width"], variables["width"].as<int>());
}

if(!variables["height"].defaulted())
{
    configTree.put(treeNames["height"], variables["height"].as<int>());
}

if(!variables["fullscreen"].defaulted())
{
    configTree.put(treeNames["fullscreen"], variables["height"].as<int>());
}

Я пытаюсь просто это. Единственное, что меня останавливает, это то, что в будущем у меня также будут переменные std :: string, что означает, что простое циклическое переключение всех значений и использование as () не сработает.

Я рассмотрел попытку использовать boost :: any for as <> (), но это не работает (множество ошибок шаблона). Я также рассмотрел наличие кортежа со значением, указывающим, какой тип он будет, затем переключался через него и вызывал соответствующий как <> (), но это кажется излишним.

Есть ли способ просто это?

1 Ответ

1 голос
/ 15 октября 2011
template<class T> void xput(const char* name) {
    if(!variables[name].defaulted())
        configTree.put(treeNames[name], variables[name].as<T>());
}

xput<int>("width");
xput<int>("height");
xput<int>("fullscreen");
xput<std::string>("future-option");

Если вы хотите добиться полиморфизма во время выполнения, преобразуйте указанную выше функцию в функтор и назначьте ее для boost :: function.

...