c++ - 使用可变模板参数增强变体访问者

标签 c++ templates stl boost-mpl boost-variant

在我的一个项目中,我积极使用 boost::variant 并且偶然发现了一个我自己无法解决的问题。我有一个 boost::variant,它可能包含原子数据类型和这些原子数据类型的 STL 容器。

现在,我想计算先前定义的 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++ - 使用可变模板参数增强变体访问者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37621321/

相关文章:

css - 在 CSS 中,如何使文本不在第二行?

c++ - 我应该如何重载模板化结构?

c++ - 在类模板方法中使用enable_if来检查两个函数参数是否都是std::array或都是std::vector

c++ - 如何清除这样声明的矩阵 -> vector<vector<int>>

c++ - std::next_permutation() 来自 vector 的一部分

c++ - C++ 中的#include 问题

android - AVD 安卓 4 : support to OpenGL ES 2. 0

c++ - 如何在 visual studio 2015 中更改条件断点上的变量值

c++ - Windows Media Foundation - 右扬声器不工作

c++ - 将 m x 3 数组更改为 STL 容器?