2010-12-08 3 views
8

나는이처럼 보이는 부스트 변형이 : 나는 표준이 변형의 값 중 하나를 변환 할 수있는 필요가 typedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;부스트 :: 변형 <T> 성병 : : 문자열

을 :: 문자열을 , 내가 할 수있는 몇 가지 템플릿 형식의 기능이 있는지 궁금해?

또는 가장 효과적인 방법은 무엇입니까?

나는 오버로드 된 함수를 많이 구현하고 각각은 형식을 취한 다음 std::stringstream을 사용하여 변환하거나 posix_time을 사용하여 변환 함수를 사용합니다. 아마도 더 좋은 방법이 있을까요?

답변

9

stringstream을 편리한 래퍼 뒤에 숨기는 boost::lexical_cast을 사용하십시오. 이것은 operator<<이 적절하기 때문에 boost :: posix_time에서도 작동합니다.

1

generically convert from boost::variant<T> to type을 참조하십시오. 당신은 그 상황에 적응할 수 있어야합니다. 특별한 해결책을 필요로하는 boost::posix_time::ptime을 제외한 모든 유형에 boost::lexical_cast을 사용할 수 있습니다. 이 모든 것은 static_visitor에서 연산자 오버로딩 (template over + ptime)을 사용합니다.

0

std::string에 특정 형식을 변환하는 깨끗하고 우아한 (하지만 더 효율적이지) 방법은

#include <boost/lexical_cast.hpp>

유형에서

template<typename Target, typename Source> Target lexical_cast(const Source& arg);

변환 할 사용하는 것입니다 ostream에 대한 일반적인 "< <"연산자를 제공해야합니다.

사용 예 : std::string s = boost::lexical_cast<std::string>(17); assert(s == "17");

+0

는 또한보다 효율적으로 할 수있다 (타입의 문자열 표현의 최대 길이 인 경우 부스트 스트림 버퍼에 스택 배열을 사용한다 컴파일 타임에 알려짐). 그러나 문제는'boost :: variant'에 ​​관한 것입니다. – UncleBens

3

이 시도 : 사실

struct to_string_visitor : boost::static_visitor<> 
{ 
    std::string str; 

    template <typename T> 
    void operator()(T const& item) 
    { 
    str = boost::lexical_cast<std::string>(item); 
    } 
    void operator()(boost::posix_time::ptime const & item) 
    { 
    //special handling just for ptime 
    } 
}; 

int main(){ 
    variant v = 34; 
    to_string_visitor vis; 
    boost::apply_visitor(vis, v); 
    cout << vis.str << endl; 
} 
+0

템플릿 방법을 전문화 할 수 없습니다. 그냥 일반이 아닌 템플릿 방법으로 만드십시오. –

+0

확인되었습니다. 나는 이것을 집계하지 않았다. –

+0

좋은 사람! 과부하의 강력한 사용법. –