我正在使用 boost::variant
在我的项目中经常出现。我的同事们现在想出了传递特定 boost::static_visitor<int>
实例的想法。以自定义访问类型。她有一些代码如下:
#include <boost/variant.hpp>
#include <iostream>
typedef boost::variant<int, std::string> TVar;
struct Visitor1 : public boost::static_visitor<int> {
template<typename T>
result_type operator()(const T&) {
return 42;
}
};
struct Visitor2 : public boost::static_visitor<int> {
template<typename T>
result_type operator()(const T&) {
return 21;
}
};
int adder(const boost::static_visitor<int>& visitor, const TVar& visitable) {
return visitable.apply_visitor(visitor) + 1;
}
int main(int argc, char **args) {
Visitor1 v1;
Visitor2 v2;
TVar x;
std::cout << adder(v1, x) << std::endl;
std::cout << adder(v2, x) << std::endl;
}
它在我看来非常完美,但无法编译。我的编译器说 expression will not yield a function that takes one 1 argument
某处知情人。
我们做错了什么?
最佳答案
apply_visitor
有一个仅接受访问者的重载。这将返回一个适合您需要的部分应用的函数对象,我猜:
这个重载返回一个
就个人而言,我喜欢像这样向访问者对象添加重载:
struct MyVisitor {
typedef void result_type;
template <typename... Ts>
result_type operator()(boost::variant<Ts...> const& v) const {
return boost::apply_visitor(*this, v);
}
// optionally repeat for non-const `v`
// normal variant handling overloads
};
这样,您可以简单地将访问者对象用作函数对象。
关于c++ - 如何将 `boost::static_visitor` 实例传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43676584/