Boost Property tree: как хранить в нем указатели? - PullRequest
1 голос
/ 02 декабря 2011

Я знаю, что это не по умолчанию и, возможно, не предпочтительный способ использования дерева свойств Boost.Но, похоже, есть все необходимое для создания дерева именованных указателей.Поэтому я попытался:

#include <boost/property_tree/ptree.hpp>

#include <iostream>
#include <string>

template <class T>
int append(T val)
{
    std::cout << "hello";
    return 0;
}

int main()
{
    using boost::property_tree::ptree;
    ptree pt;
    pt.put("function-int-pointer", &append<int>);

    (pt.get("function-int-pointer", NULL))(123);
    // ^-- error C2064: term does not evaluate to a function taking 1 arguments

    (pt.get<int(*)(int)>("function-int-pointer"))(123);
    // ^-- error C2678: binary '>>' : no operator found which takes a left-hand 
    // operand of type 'std::basic_istream<_Elem,_Traits>' (or there is no 
    // acceptable conversion)
} 

Если бы это было возможно, я бы хотел, чтобы они автоматически восстанавливались (с простыми .get(), а не .get<T>)

Кажется, что он может хранить указателифункции (основной резонанс я хочу использовать).Но я не могу получить их от него (поэтому мне интересно, как хранить указатели в дереве свойств Boost, чтобы они могли быть автоматически восстановлены?

1 Ответ

2 голосов
/ 02 декабря 2011

Я собираюсь попытаться ответить на суть вопроса здесь.Я думаю, что вы тоже можете довольствоваться Boost Serialization?

Boost serialization - очень мощная универсальная библиотека сериализации, способная сериализовать в

  • обычный текст
  • XML
  • двоичные архивы

Он поставляется с полной поддержкой широкого спектра типов данных 1 - но не для указателей на функции из коробки.Однако из-за своей расширяемой природы Петр Димов предложил способ сериализации функций по имени, регистрации функций вручную.В эскизе это будет выглядеть следующим образом:

template<class T> void register_static( T * pt, std::string const & name ) 
 { 
 // add to name<->address maps 
 } 

template<class T> void save(T * const & pt) 
 { 
 // look up the name of pt and save 
 } 

template<class T> void load(T * & t) 
 { 
 // load name, look up address, store in pt 
 }

Обратите внимание, что T может быть любого вызываемого типа

  • тип функции
  • указатель функции
  • функциональный объект (например, std::less())
  • лямбда-выражение

Важно, однако, зарегистрировать каждый экземпляр вызываемого типа по имени,поскольку адреса не были бы сэмом для отдельных экземпляров.


1 стандартные контейнеры, указатели, структуры данных с внутренними (указательными) ссылками, псевдонимы-указатели, циклическиедеревья и т. д.

...