我知道以下代码编译:
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...;
};
我在注释中尝试了代码的所有选项,但没有编译。 我该如何解决?
答案 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;
}