循环浏览模板类型

时间:2018-06-30 14:52:39

标签: c++ c++11 templates c++14

我有一个带有两个模板参数的函数,一个用于矢量数据类型(intfloatdouble等),另一个用于整数类型({{1 }},intint16_t等)

uint32_t

对于测试,我现在想遍历数据/整数类型的每种可能组合,例如

template <typename T, typename I>
void
add(std::vector<T> array, std::vector<I> idx) {
  // ...
}

是否可以完全遍历类型?怎么样?

2 个答案:

答案 0 :(得分:1)

可能有更简单的方法,但是我将使用boost hana library,如下所示:

#include <boost/hana/for_each.hpp>
#include <boost/hana/tuple.hpp>
#include <vector>
#include <iostream>
#include <boost/type_index.hpp>

namespace hana = boost::hana;

// for example's sake, just print the type
template <typename T, typename I>
void add(std::vector<T> array, std::vector<I> idx) {

    using namespace boost::typeindex;
    std::cout << type_id<T>().pretty_name() << " - " << type_id<I>().pretty_name() << std::endl;
}

int main() {

    auto types1 = hana::tuple_t<int, int16_t, int32_t>;
    auto types2 = hana::tuple_t<float, double, int, int16_t>;

    hana::for_each(types1, [types2](auto t1) {

        hana::for_each(types2, [t1](auto t2) {

            using t1_type = typename decltype(t1)::type;
            using t2_type = typename decltype(t2)::type;

            add<t1_type, t2_type>({}, {});
        });
    });
}

答案 1 :(得分:0)

如果您手头有空,那么boost::hana无疑是您的最佳选择。但是,如果需要,手动重新实现该功能并不是很困难。

#include <iostream>

template<typename... T>
struct iterator {
  template<typename CB_T>
  static void iterate(CB_T const& ) {}
};

template<typename first, typename... rest>
struct iterator<first, rest...> {
  template<typename CB_T>
  static void iterate(CB_T const& cb) {
    cb(first());
    iterator<rest...>::iterate(cb);
  }
};

int main() {
  iterator<int, float>::iterate([](auto const & v_1){
    using v_1_t = decltype(v_1);
    iterator<char, double>::iterate([&](auto const & v_2){
      using v_2_t = decltype(v_2);
      std::cout << typeid(v_1_t).name() << " vs " << typeid(v_2_t).name() << "\n";
    });
  });
  return 0;
}