부스트 속성 트리에 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::any
더 operator <<
이 없습니다
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]’
의
간단한 예는이 주셔서 너무 감사합니다! 나는 질문이있다. 다른 것을 전달하기로 결정하는 순간 번역가를 연장해야합니다. 나는 조금만 파고 들었다. 나는 [boost :: spirit :: hold_any] (http://www.boost.org/doc/libs/1_50_0/boost/spirit/home/support/detail/hold_any.hpp)와 같은 것을 보았다. 그것은 stringstream 출력 기능을 가지고있는 것 같습니다. 그러나 나는 그것을 사용하는 방법을 잘 모르겠습니다. 어떤 아이디어? –
@SubhamoySengupta hold_any는 정신의 세부 사항입니다 ... 그런 점에서 사용법은 좋지 않습니다. 그리고 T는 operator <<를 사용하기 때문에 hold_any를 사용하여 벡터를 출력 할 수는 없지만 vector에는 operator <<가 없습니다. – ForEveR
대단히 감사합니다! 잠시 기다리고 싶습니다. 정답을 표시하기 전에 방금 게시했기 때문에 잠시 기다리고 싶습니다. 그러나 제가 권고해야 할 것은 제가해야 할 일이라고 생각합니다. –