如何扩展依赖类型的参数包?

问题描述

扩展参数包的语法是什么,我想要的类型直接取决于参数包中的类型?

例如:

template <typename T>
struct foo
{
   typedef T value_type;
};

template <typename ... T>
struct aggregate_of_foo
{
   typedef std::tuple<foo<T>::value_type...> tuple; // MSVC compiler error here
};

解决方法

如果您在foo中使用bar而不是typedef,则之前只是缺少typename关键字:

template <typename ... T>
struct aggregate_of_foo
{
   using tuple_foo =  std::tuple<typename foo<T>::value_type...>;
                      //         ^^^^^^^^
};

还请注意,我将其命名为tuple_foo,因为这比仅拥有tuple更有意义。

,

您必须使用关键字typename,因为在这种情况下value_type是一个从属名称。

template <typename ... T>
struct aggregate_of_foo
{
    typedef std::tuple<typename foo<T>::value_type...> tuple; //here
};