boost::variant 的默认访问者函数
default visitor function for boost::variant
假设我有这样一个变体定义:
typedef boost::variant <
v1,
v2,
v3,
...
vn
> v;
我需要为每个 v1 到 vn 编写一个带有访问者函数的访问者 class,如下所示:
class myvisitor : public boost::static_visitor<bool> {
bool operator()(v1) {}
bool operator()(v2) {}
...
bool operator()(vn) {}
}
所以如果除了 v1 的函数之外所有这些函数都相同,那么我只想定义
bool operator()(v1) {}
同时将所有其他保留为某种默认形式以避免编写大量无用和重复的代码。
所以这是否可能?或者 boost 开发人员可以在他的下一个版本中这样做吗?
只需将默认 "case" 设置为开放模板成员 operator()
:
#include <boost/variant.hpp>
#include <iostream>
struct MyStruct {
int a, b, c;
};
using V = boost::variant<int, MyStruct, std::string, double>;
struct MyVisitor : boost::static_visitor<void> {
void operator()(int) const { std::cout << __PRETTY_FUNCTION__ << "\n"; }
void operator()(std::string const &) const { std::cout << __PRETTY_FUNCTION__ << "\n"; }
// the default case:
template <typename T> void operator()(T const &) const {
std::cout << "FALLBACK: " << __PRETTY_FUNCTION__ << "\n";
}
};
int main() {
V v;
for (auto v : { V(42), V(3.14), V("hello world"), V( MyStruct{1,2,3} ) })
boost::apply_visitor(MyVisitor(), v);
}
输出:
void MyVisitor::operator()(int) const
FALLBACK: void MyVisitor::operator()(const T&) const [with T = double]
void MyVisitor::operator()(const string&) const
FALLBACK: void MyVisitor::operator()(const T&) const [with T = MyStruct]
假设我有这样一个变体定义:
typedef boost::variant <
v1,
v2,
v3,
...
vn
> v;
我需要为每个 v1 到 vn 编写一个带有访问者函数的访问者 class,如下所示:
class myvisitor : public boost::static_visitor<bool> {
bool operator()(v1) {}
bool operator()(v2) {}
...
bool operator()(vn) {}
}
所以如果除了 v1 的函数之外所有这些函数都相同,那么我只想定义
bool operator()(v1) {}
同时将所有其他保留为某种默认形式以避免编写大量无用和重复的代码。
所以这是否可能?或者 boost 开发人员可以在他的下一个版本中这样做吗?
只需将默认 "case" 设置为开放模板成员 operator()
:
#include <boost/variant.hpp>
#include <iostream>
struct MyStruct {
int a, b, c;
};
using V = boost::variant<int, MyStruct, std::string, double>;
struct MyVisitor : boost::static_visitor<void> {
void operator()(int) const { std::cout << __PRETTY_FUNCTION__ << "\n"; }
void operator()(std::string const &) const { std::cout << __PRETTY_FUNCTION__ << "\n"; }
// the default case:
template <typename T> void operator()(T const &) const {
std::cout << "FALLBACK: " << __PRETTY_FUNCTION__ << "\n";
}
};
int main() {
V v;
for (auto v : { V(42), V(3.14), V("hello world"), V( MyStruct{1,2,3} ) })
boost::apply_visitor(MyVisitor(), v);
}
输出:
void MyVisitor::operator()(int) const
FALLBACK: void MyVisitor::operator()(const T&) const [with T = double]
void MyVisitor::operator()(const string&) const
FALLBACK: void MyVisitor::operator()(const T&) const [with T = MyStruct]