使用可变参数模板参数提升变体访问者
Boost variant visitor with variadic template arguments
在我的一个项目中,我正在积极使用boost::variant
,我偶然发现了一个我自己无法解决的问题。我有一个可能包含原子数据类型和这些原子数据类型的 STL 容器的boost::variant
。
现在,我想计算以前定义的boost::variant
类型的实例的大小。基本上只有两种可能的功能。原子数据类型的类型仅为 1,而 STL 容器的大小定义为其中包含的元素数。
只有 2 个原子数据,我实现了以下代码:
#include <boost/variant.hpp>
#include <string>
#include <iostream>
#include <vector>
typedef boost::variant<int, double, std::vector<int>, std::vector<double> > TVariant;
struct sizeVisitor : boost::static_visitor<size_t> {
size_t operator()(int&) {
return 1;
}
size_t operator()(double&) {
return 1;
}
size_t operator()(std::vector<int>& c) {
return c.size();
}
size_t operator()(std::vector<double>& c) {
return c.size();
}
} ;
int main(int argc, char **args) {
sizeVisitor visitor;
TVariant var=5;
std::cout << boost::apply_visitor(visitor, var) << std::endl;
std::vector<int> vector;
vector.push_back(6);
vector.push_back(2);
var=vector;
std::cout << boost::apply_visitor(visitor, var) << std::endl;
}
随着原子数据类型数量的增加,我有很多代码重复。我必须为每个新的原子数据类型声明另外两个函数,这可能令人望而却步。
如果以下代码可以编译,那就太好了:
#include <boost/variant.hpp>
#include <string>
#include <iostream>
#include <vector>
typedef boost::variant<int, double, std::vector<int>, std::vector<double> > TVariant;
struct sizeVisitor : boost::static_visitor<size_t> {
size_t operator()(boost::variant<int,double>&) {
return 1;
}
size_t operator()(boost::variant<std::vector<int>,std::vector<double>>& c) {
return c.size();
}
} ;
int main(int argc, char **args) {
sizeVisitor visitor;
TVariant var=5;
std::cout << boost::apply_visitor(visitor, var) << std::endl;
std::vector<int> vector;
vector.push_back(6);
vector.push_back(2);
var=vector;
std::cout << boost::apply_visitor(visitor, var) << std::endl;
}
不幸的是,第二个非编译访问者的最接近的实现是什么?
只需使用两个函数模板即可operator()
:
struct sizeVisitor
: boost::static_visitor<size_t>
{
template <class T>
size_t operator()(T const&) {
return 1;
}
template <class T>
size_t operator()(std::vector<T> const& v) {
return v.size();
}
};
模板部分排序规则将确保调用正确的部分排序规则。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 访问者访问变体并返回不同类型时出错
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 提升预定义为带有参数的全局 lambda 的变体访问者
- 使用可变参数模板参数提升变体访问者
- C#:委托、紧凑访问者"universal callable"参数类型
- 具有多个参数的访问者模式