2010-12-09 47 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

我的問題難以理解或者沒有人知道嗎? – 2010-12-09 09:09:22

+3

在某些地方很早...在這個時候,美國人仍然會睡覺,歐洲的一些人(像我一樣)仍然會爬上一杯咖啡醒來。時間喝咖啡! – 2010-12-09 09:21:51

回答

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

也許一個更通用的訪問者將是有序的,留給調用者如何處理字符串表示。

#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; 
}