在boost :: static_visitor中operator()中的其他参数
Additional argument in operator() in boost::static_visitor
我必须创建boost::variant
对象并使用static_visitor
。不幸的是我需要额外的参数...
哪种解决方案更好?要将这个对象作为类的字段,当我想使用访问者时,我必须创建实例:
class Visitor : public boost::static_visitor<>
{
public:
Visitor(int extra): extra{extra} {}
void operator()(const T1&) { /* ... */}
void operator()(const T2&) { /* ... */}
private:
int extra;
};
并每次我想使用它时创建访客对象:
Visitor visitor(x);
boost::apply_visitor(visitor, t);
或使用boost ::绑定并创建访客一次并使用boost::bind
?
class Visitor : public boost::static_visitor<>
{
public:
void operator()(const T1&, int extra) { /* ... */ }
void operator()(const T2&, int extra) { /* ... */ }
};
用法:
auto visitor = std::bind(SctpManager::Visitor(), std::placeholders::_1, extra);
boost::apply_visitor(visitor, t);
什么更好(更快,更优雅)解决方案?
或有更好的解决方案?
本质上没有更优雅的方式。您可以使用lambdas(如果您的编译器/Boost版本足够现代)。
"低技术"选项是使用保持状态的结构(第三个示例):
活在coliru
#include <boost/variant.hpp>
#include <iostream>
struct T1{};
struct T2{};
struct Visitor : boost::static_visitor<>
{
void operator()(T1 const&, int extra) const { std::cout << __PRETTY_FUNCTION__ << " extra:" << extra << "n"; }
void operator()(T2 const&, int extra) const { std::cout << __PRETTY_FUNCTION__ << " extra:" << extra << "n"; }
};
int main() {
boost::variant<T1, T2> tests[] = { T1{}, T2{} };
{
Visitor vis;
for (auto v: tests)
apply_visitor([=](auto const& v) { vis(v, 42); }, v);
}
{
auto vis = [vis=Visitor{}](auto const& v) { vis(v, 1); };
for (auto v: tests)
apply_visitor(vis, v);
}
{
struct {
using result_type = void;
int extra;
void operator()(T1 const&) const { std::cout << __PRETTY_FUNCTION__ << " extra:" << extra << "n"; }
void operator()(T2 const&) const { std::cout << __PRETTY_FUNCTION__ << " extra:" << extra << "n"; }
} vis { 99 };
for (auto v: tests)
apply_visitor(vis, v);
}
}
打印
void Visitor::operator()(const T1&, int) const extra:42
void Visitor::operator()(const T2&, int) const extra:42
void Visitor::operator()(const T1&, int) const extra:1
void Visitor::operator()(const T2&, int) const extra:1
void main()::<unnamed struct>::operator()(const T1&) const extra:99
void main()::<unnamed struct>::operator()(const T2&) const extra:99
相关文章:
- C++ 默认参数使用其他参数
- lambda 作为接受其他参数的参数的初始化顺序
- 了解'this'或其他参数是否为右值
- 递归回文检查,不使用向量、大小或其他参数
- 模板模板参数用作其他参数的默认值
- 可以移动构造函数以除班级本身以外的其他参数
- 在传递其他参数时在 C++ 中重载运算符
- 具有可变参数模板参数的部分专用化,后跟其他参数
- 在参数包中获取函数指针的返回类型,并将其保存为与其他参数连接的元组
- 委托构造函数和默认参数,具体取决于其他参数
- 在boost :: static_visitor中operator()中的其他参数
- 带有映射参数的函数需要其他参数
- 是否有一个WinAPI可以从带有可选空格和其他参数的命令行获取文件名
- 后面跟有其他参数的函数参数包的模板参数推导
- 将字符串(或任何其他参数)传递到QWidget构造函数
- 使用其他参数的默认参数
- 如何设置依赖于其他参数的参数默认值
- C++获取具有其他参数的构造函数的初始值设定项列表
- C++函数模板,函数作为参数,取决于其他参数
- 使用 boost::bind 但允许传递任何其他参数