模板参数取决于参数列表

时间:2016-06-15 10:09:36

标签: c++ c++11 variadic-templates using

我定义了班级

template <typename... Ts> struct Bar {
   using inner_type = /* whatever */;
};

现在,我需要定义一个模板化的类Foo,其模板参数是一些参数包,以及为该参数包实例化的类型Bar::inner_type的值。不幸的是我似乎无法做到这一点。如果我这样定义:

template <Bar<Ts...>::inner_type SomeValue, typename... Ts> struct Foo { };

编译器在使用时无法识别Ts,因为它还没有看到参数包;但如果我这样定义:

template <typename... Ts, Bar<Ts...>::inner_type SomeValue> struct Foo { };

编译器嘲笑我试图在其他模板参数之前使用参数包。

那我怎么能这样做呢?

注意:如果重要,GCC 4.9.3对我失败了。

4 个答案:

答案 0 :(得分:2)

您可以部分地对结构进行专门化:

template<typename...>
struct Bar { using inner_type = int; };

template <typename T, typename T::inner_type T>
struct Foo;

template <typename... Ts, typename Bar<Ts...>::inner_type SomeValue>
struct Foo<Bar<Ts...>, SomeValue> { };

int main() {
    Foo<Bar<int>, 3> foo;
}

这样推导出Ts参数包,Foo期望第二个模板参数的类型为Bar<Ts...>::inner_type

答案 1 :(得分:1)

我能想到的最好的事情是:

template <class Inner, Inner Val, class... Args>
struct Foo {
  static_assert(std::is_same<Inner, typename Bar<Args...>::inner_type>::value, "Wrong type");
};

您需要明确命名类型。

答案 2 :(得分:0)

这可以解决问题吗?

#include <type_traits>

using namespace std;

template <typename... Ts> class Bar {
 public:
    using inner_type = int;
};

template <typename... Ts> class Foo {
  using bar_inner_type = typename Bar<Ts...>::inner_type;
  static_assert(is_same<int, bar_inner_type>::value,"");
};

答案 3 :(得分:0)

如果我理解你的问题,你可以这样做:

template <typename... Ts> struct Bar {
   using inner_type = /* whatever */;
};

template <typename... Ts> struct Foo {
   using inner_type = typename Bar<Ts...>::inner_type;
};