2012-09-13 1 views
2

부스트 속성 트리에 boost :: any 형식을 저장하려고합니다. 다음은 몇 가지 실행 가능한 예제입니다.boost :: property_tree에 boost :: any 추가 중 가능합니까?

#include <string> 
#include <vector> 
#include <sstream> 
#include <iostream> 
#include <sys/types.h> 
#include <boost/any.hpp> 
#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/json_parser.hpp> 

int main() 
{ 
    boost::property_tree::ptree pTree_Root; 
    pTree_Root.put("sigRoot.property1", "value1"); 
    pTree_Root.put("sigRoot.property2", "value2"); 
    pTree_Root.put("sigRoot.property3", "value3"); 

    std::vector<std::string> vecString; 

    for(int i = 0; i <= 5; i++) { 
     vecString.push_back("somestring"); 
    } 

    boost::any anyVar = vecString; 

    pTree_Root.put("sigRoot.property4", anyVar); 

    std::stringstream ss; 
    boost::property_tree::json_parser::write_json(ss, pTree_Root); 
    std::string jsonString = ss.str(); 

    jsonString.erase(std::remove(jsonString.begin(), jsonString.end(), '\n'), jsonString.end()); 

    std::cout << jsonString << std::endl; 

    return 0; 
} 

이 경우 작동하지 않습니다. boost :: any는 직렬화 할 수 없습니다. 그러나 나는 anyVar.type()을 질의 할 수있게되었지만, 그걸로 무엇을 할 수 있는지 전혀 모른다. 아무 래도 auto 또는 뭔가 다른 유형의 알려진 숫자를 명시 적으로 코딩하지 않고 속성 트리에 데이터를 추가하는 것이 가능합니까? C++ 11/C++ 0x 메소드도 환영합니다. boost::anyoperator <<이 없습니다

In file included from /usr/include/boost/property_tree/ptree.hpp:17:0, 
       from pTreeTest.cpp:8: 


/usr/include/boost/property_tree/stream_translator.hpp: In static member function ‘static void boost::property_tree::customize_stream<Ch, Traits, E, Enabler>::insert(std::basic_ostream<_Ch, _Tr>&, const E&) [with Ch = char, Traits = std::char_traits<char>, E = boost::any, Enabler = void]’: 
/usr/include/boost/property_tree/stream_translator.hpp:199:13: instantiated from ‘boost::optional<std::basic_string<Ch, Traits, Alloc> > boost::property_tree::stream_translator<Ch, Traits, Alloc, E>::put_value(const E&) [with Ch = char, Traits = std::char_traits<char>, Alloc = std::allocator<char>, E = boost::any]’ 
/usr/include/boost/property_tree/detail/ptree_implementation.hpp:795:54: instantiated from ‘void boost::property_tree::basic_ptree<Key, Data, KeyCompare>::put_value(const Type&, Translator) [with Type = boost::any, Translator = boost::property_tree::stream_translator<char, std::char_traits<char>, std::allocator<char>, boost::any>, Key = std::basic_string<char>, Data = std::basic_string<char>, KeyCompare = std::less<std::basic_string<char> >]’ 
/usr/include/boost/property_tree/detail/ptree_implementation.hpp:817:13: instantiated from ‘boost::property_tree::basic_ptree<K, D, C>& boost::property_tree::basic_ptree<Key, Data, KeyCompare>::put(const path_type&, const Type&, Translator) [with Type = boost::any, Translator = boost::property_tree::stream_translator<char, std::char_traits<char>, std::allocator<char>, boost::any>, Key = std::basic_string<char>, Data = std::basic_string<char>, KeyCompare = std::less<std::basic_string<char> >, boost::property_tree::basic_ptree<Key, Data, KeyCompare>::path_type = boost::property_tree::string_path<std::basic_string<char>, boost::property_tree::id_translator<std::basic_string<char> > >]’ 
/usr/include/boost/property_tree/detail/ptree_implementation.hpp:832:72: instantiated from ‘boost::property_tree::basic_ptree<K, D, C>& boost::property_tree::basic_ptree<Key, Data, KeyCompare>::put(const path_type&, const Type&) [with Type = boost::any, Key = std::basic_string<char>, Data = std::basic_string<char>, KeyCompare = std::less<std::basic_string<char> >, boost::property_tree::basic_ptree<Key, Data, KeyCompare>::path_type = boost::property_tree::string_path<std::basic_string<char>, boost::property_tree::id_translator<std::basic_string<char> > >]’ 



pTreeTest.cpp:26:47: instantiated from here 
/usr/include/boost/property_tree/stream_translator.hpp:33:13: error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’ 
/usr/include/c++/4.6/ostream:581:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = boost::any]’ 

답변

5

번호 :

내가 얻을 오류입니다. property_treeany을 사용할 수 없습니다. anyVar.type()std::typeinfo을 반환하면이 클래스는 runtime 유형에 대한 정보를 제공합니다.
template<typename Type, typename Translator> 
    self_type & put(const path_type & path, const Type & value, Translator tr); 

트리의 데이터 형식으로 변환 된 제공된 값으로 주어진 경로의 노드의 값을 설정한다. 노드가 없으면 누락 된 모든 부모를 포함하여 노드가 작성됩니다.

당신은 Translator을 만들고 ptree 정말 basic_ptree<std::string, std::string> 당신의 번역기가 anystring에 변환해야하기 때문에, 그것은 넣어 함수로 전달할 수 있습니다. 번역기

struct SimpleTranslator 
{ 
public: 
    boost::optional<std::string> put_value(const boost::any& value) 
    { 
     if (value.type() == typeid(std::vector<std::string>)) 
     { 
     std::stringstream ss; 
     std::vector<std::string> vec = boost::any_cast<std::vector<std::string>>(value); 
     std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(ss)); 
     return ss.str(); 
     } 
     return boost::optional<std::string>(); 
    } 
}; 

http://liveworkspace.org/code/275820c1becfb63deda4e4eed8524833

+0

간단한 예는이 주셔서 너무 감사합니다! 나는 질문이있다. 다른 것을 전달하기로 결정하는 순간 번역가를 연장해야합니다. 나는 조금만 파고 들었다. 나는 [boost :: spirit :: hold_any] (http://www.boost.org/doc/libs/1_50_0/boost/spirit/home/support/detail/hold_any.hpp)와 같은 것을 보았다. 그것은 stringstream 출력 기능을 가지고있는 것 같습니다. 그러나 나는 그것을 사용하는 방법을 잘 모르겠습니다. 어떤 아이디어? –

+0

@SubhamoySengupta hold_any는 정신의 세부 사항입니다 ... 그런 점에서 사용법은 좋지 않습니다. 그리고 T는 operator <<를 사용하기 때문에 hold_any를 사용하여 벡터를 출력 할 수는 없지만 vector에는 operator <<가 없습니다. – ForEveR

+0

대단히 감사합니다! 잠시 기다리고 싶습니다. 정답을 표시하기 전에 방금 게시했기 때문에 잠시 기다리고 싶습니다. 그러나 제가 권고해야 할 것은 제가해야 할 일이라고 생각합니다. –