2010-12-09 2 views
0

을 반환 값을 얻거나 값 :통과 내가 템플릿이처럼 보이는이

struct add_node_value_visitor : boost::static_visitor<> 
{ 
    add_node_value_visitor(){} 

    template <typename T> 
    void operator() (const T& value) const 
    { 
     boost::lexical_cast<std::string, T>(value); 
    } 

}; 

내가 가진 문제는, 방문자는 값의 무리를 통해 루프 반복하는의 내부에 사용된다는이며, 결과 값 문자열은 하나의 문자열이어야합니다. 현재는 원하는 문자열이 아닌 별도의 문자열을 생성합니다.이 문제를 해결하기 위해이 구조체의 ctor에 함수 포인터를 추가하면 각 루프 반복의 결과 문자열을 연결하고 하나의 문자열을 작성하는 함수를 전달할 수 있습니다. 그런 다음 연결을 필요로하지 않는 곳에서이 구조체를 사용하려면 여전히 그렇게 할 수 있습니다. 문제는 내가 함수 포인터를 사용해야하는지 아니면 boost :: lambda와 같은 것으로 이것을 할 수 있는가하는 것입니다.

아니면 boost :: function을 사용하기가 더 쉬울까요?

+0

제 질문은 이해할 수 없습니까? –

+3

그것은 꽤 초기에 몇몇 장소에서 ...이 시간에 미국의 사람들은 여전히 ​​자고있을 것이고, 유럽의 일부 사람들 (나 같은)은 여전히 ​​깨어나 기 위해 커피 찻잔을 향해 기어 다니고있을 것입니다. 커피 시간! –

답변

1

이와 비슷한?

struct add_node_value_visitor : public boost::static_visitor<> 
{ 
public: 
    typedef std::function<void(const std::string&)> concat_func_t; 

    add_node_value_visitor(const concat_func_t& concat) : concat_(concat){} 

    template <typename T> 
    void operator() (const T& value) const 
    { 
     concat_(boost::lexical_cast<std::string, T>(value)); 
    } 

private: 
    concat_func_t concat_; 
}; 
0

연결을 수행하지 않는 이유는 무엇입니까?

struct add_node_value_visitor : boost::static_visitor<> 
{ 
    std::ostringstream st; 
    template <typename T> 
    void operator() (const T& value) { 
     // change concatenation logic here if required (separators...) 
     st << value; 
    } 
    std::string const & str() const { 
     return st.str(); 
    } 
}; 
+0

연결이 필요없는 장소에서이 함수를 사용할 수 있습니다. 따라서 제 위치에서 처리하면 융통성이 줄어 듭니다. –

+0

여분의 복잡성 (코드, 호출 장소)이 보상됩니까? 코드의 10 줄을 차지하는 두 개의 다른 펑터를 작성해야하는데, 그 중 가장 보편적 인 보일러 플레이트 대 여분의 복잡성 추가 (클래스에 함수 포인터/연결 펑터를 추가하고 추가 함수/펑터를 작성해야합니다. . 그게 더 간단합니다? 적은 오류가 발생하기 쉬운? 당신은 실제로 무엇을 달성합니까? –

0

아마도보다 일반적인 목적의 방문객이 순서대로 있어야 할 것입니다. 발신자에게 문자열 표현으로 무엇을 할지를 떠올리십시오.

#include <boost/variant.hpp> 
#include <boost/lexical_cast.hpp> 
#include <string> 
#include <vector> 
#include <iostream> 

struct to_string : boost::static_visitor<std::string> 
{ 

    template <typename T> 
    std::string operator() (const T& value) const 
    { 
     return boost::lexical_cast<std::string, T>(value); 
    } 

}; 

int main() 
{ 
    std::vector<boost::variant<int, double> > vec; 
    vec.push_back(42); 
    vec.push_back(3.14); 
    std::string result; 
    for (size_t i = 0; i != vec.size(); ++i) { 
     result += boost::apply_visitor(to_string(), vec[i]) + ' '; 
    } 
    std::cout << result; 
}