代码之家  ›  专栏  ›  技术社区  ›  motam79

在C++模板参数中,是否可以指定该类型的发生类型和数量?

  •  1
  • motam79  · 技术社区  · 7 年前

    我在C++中有一个可变的模板类(类似于 std::tuple )在实例化类时,我需要键入很多类型,例如

    MyClass<int, int, double, double, double> my_obj;
    

    这种方法在类型数量较少时有效。但是,如果我有10个 ints 其次是20 doubles ,输入它会很麻烦并且容易出错。

    C++中是否有机制来指定类型,然后在 template <> 争论?像这样:

    MyClass<some_magic(int,2), some_magic(double, 3)> my_obj;
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Jans    7 年前

    这将使它:

    namespace detail{
        template <class T, auto> using always_t = T;
    
        template <class T, std::size_t... Idx>
        auto repeat_impl(std::index_sequence<Idx...>) -> std::tuple<always_t<T, Idx>...>;
    
        template <class T, class...>
        struct pack
        {
            using type = T;
        };
        template <class... T, class... R, class... Tuple>
        struct pack<std::tuple<T...>, std::tuple<R...>, Tuple...>
            : pack<std::tuple<T..., R...>, Tuple...>
        { };
    
        template <class> struct tuple_to_class;
        template <class... T> struct tuple_to_class<std::tuple<T...>>
        {
            using type = MyClass<T...>;
        };
    }
    
    template <class T, std::size_t N>
    using repeat_t = decltype(detail::repeat_impl<T>(std::make_index_sequence<N>{}));
    
    template <class... Repeats>
    using ToMyClass = typename detail::tuple_to_class<typename detail::pack<Repeats...>::type>::type;
    

    using C = MyClass<int, int, double, double, double>;
    
    static_assert(std::is_same_v<C,
                  ToMyClass<repeat_t<int, 2>, repeat_t<double, 3>>
                  >);
    

    Live demo