2010-12-09 94 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; 
}