我的模板看起来像这样:
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);
}
};
我遇到的问题是访问者在for循环中使用迭代一堆值,结果值的字符串需要是一个字符串,目前这会产生一堆单独的字符串,这不是什么我想,所以为了解决这个问题,我想我会添加一个函数指针到这个结构的ctor,这样我就可以传入一个函数来连接每个循环迭代的结果字符串并创建一个字符串。然后如果我想在不需要连接的情况下使用这个结构,我仍然可以这样做。问题是我是否应该使用函数指针,或者是否可以使用boost :: lambda?
这样做或者boost :: function会更容易使用吗?
答案 0 :(得分: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_;
};
答案 1 :(得分: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();
}
};
答案 2 :(得分: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;
}