Boost属性树:如何在其中存储指针?

时间:2011-12-01 21:18:06

标签: c++ pointers boost boost-propertytree

我知道它不是默认的,也许不是首选使用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 个答案:

答案 0 :(得分:2)

我打算在这里回答这个问题的要点。我想你也可能对Boost Serialization满意吗?

Boost序列化是一个非常强大的通用序列化库,能够序列化到

  • 纯文字
  • XML
  • 二元档案

它完全支持各种数据类型 1 - 虽然不适用于开箱即用的函数指针。但是,由于它的可扩展性,Peter Dimov came up提供了一种按名称序列化函数的方法,手动注册函数。在草图中,看起来像:

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()
  • 一个lambda表达式

然而,重要的是,要按名称注册可调用类型的每个实例,因为地址不是单独实例的sam。


<子> 1 标准容器,指针,具有内部(指针)引用的数据结构,别名指针,循环树等。