【发布时间】:2016-05-13 23:51:08
【问题描述】:
定义template_pack,如下例所示。给定
template <typename> struct A;
template <typename, typename, typename> struct B;
template <typename, typename> struct C;
然后
template_pack<std::tuple<char, bool, double>, A, B, C>::type
将成为
std::tuple<A<char>, B<char, bool, double>, C<char, bool>>
即总是在元组中从左到右读取,以便获得足够的类型来适应每个模板。
到目前为止,这是我的解决方案。但它只适用于最多 3 种类型的模板,我看不出如何推广到任何类型的模板:
#include <type_traits>
#include <tuple>
template <template <typename...> class Template, typename... Ts> struct use_template;
template <template <typename> class Template, typename A, typename... Rest>
struct use_template<Template, A, Rest...> {
using type = Template<A>;
};
template <template <typename, typename> class Template, typename A, typename B, typename... Rest>
struct use_template<Template, A, B, Rest...> {
using type = Template<A,B>;
};
template <template <typename, typename, typename> class Template, typename A, typename B, typename C, typename... Rest>
struct use_template<Template, A, B, C, Rest...> {
using type = Template<A,B,C>;
};
template <typename Pack, template <typename...> class... Templates> struct template_pack;
template <template <typename...> class P, typename... Ts, template <typename...> class... Templates>
struct template_pack<P<Ts...>, Templates...> {
using type = P<typename use_template<Templates, Ts...>::type...>;
};
// Testing
template <typename> struct A;
template <typename, typename, typename> struct B;
template <typename, typename> struct C;
int main() {
static_assert (std::is_same<
template_pack<std::tuple<char, bool, double>, A, B, C>::type,
std::tuple<A<char>, B<char, bool, double>, C<char, bool>>
>::value, "");
}
如何概括以上内容?有没有可能?
【问题讨论】:
标签: c++ templates tuples c++14 variadic-templates