使用可变参数模板

时间:2017-03-08 22:29:23

标签: c++ variadic-templates using

我知道以下代码编译:

template<class Type>
class Foo
{
    using type = Type;
};

现在,我正在尝试编译以下代码:

template<class Type, class... OtherTypes>
class Foo
{
    using type = Type;
    // using types = OtherTypes;
    // using... types = OtherTypes;
    // using types... = OtherTypes;
    // using types = OtherTypes...;
    // using types... = OtherTypes...;
};

我在注释中尝试了代码的所有选项,但没有编译。 我该如何解决?

2 个答案:

答案 0 :(得分:0)

您不能将一揽子类型作为类中的类型。

你能得到的最接近的是:

template<class...Ts> struct types_t { constexpr types_t(){}; };
template<class...Ts> constexpr types_t<Ts...> types{};

这些是表示类型包的值和类型。

template<class Type, class... OtherTypes>
class Foo
{
  using type=Type;
  using types=types_t<OtherTypes...>;
};

然后我们可以编写使用捆绑类型的辅助函数并在其他地方使用它们。

template<template<class...>class Z, class Types>
struct apply_types;    
template<template<class...>class Z, class...Ts>
struct apply_types<Z, types_t<Ts...>> {
  using type=Z<Ts...>;
};

template<template<class...>class Z, class Types>
using apply_types_t = typename apply_types<Z,Types>::type;

现在apply_types< some_template, some_types_t >获取包中的类型并将它们传递给模板。

答案 1 :(得分:0)

假设您要使用pack作为模板参数。然后你可以尝试以下方法。

#include <utility>

template <class... Types>
struct Foo {};

template <template <class...> class Template,
          class... Types,
          template <class...> class T>
Template<Types...> foo(const T<Types...> &);

template <template <class...> class Template, class T>
using Type = decltype(foo<Template>(std::declval<T>()));

int main() {
  using T = Foo<int, int>;

  // As template argument
  using Tuple = Type<std::tuple, T>;
  static_assert(std::is_same<Tuple, std::tuple<int, int> >::value, "");

  return 0;
}