代码之家  ›  专栏  ›  技术社区  ›  Nico Schlömer David Maze

循环模板类型

  •  2
  • Nico Schlömer David Maze  · 技术社区  · 6 年前

    我有一个有两个模板参数的函数,一个用于向量数据类型( int float , double 内景 int16_t , uint32_t

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

    对于测试,我现在想循环所有可能的数据/整数类型组合,例如。,

    // pseudo code
    for I in [int, int16_t, int32_t, ...] {
        for T in [float, double, int, int16_t, ...] {
            // create arguments a, b
            add<T, I>(a, b);
        }
    }
    

    有可能循环类型吗?怎么用?

    2 回复  |  直到 6 年前
        1
  •  1
  •   linuxfever    6 年前

    可能有更简单的方法,但我会使用 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>({}, {});
            });
        });
    }
    
        2
  •  1
  •   Frank    6 年前

    如果你手上有助推器的话 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;
    }