获取模板模板类中

时间:2016-05-17 17:23:59

标签: c++ c++11

假设我们有一个班级

template <int ... values>
struct foo;

现在我有一个功能

template<typename foo_type, typename U>
void bar(foo_type a, U b);

其中foo_type基本上是foo。我的问题是,我不希望a函数中的变量bar。我希望能够像这样调用函数

bar<foo<6,5,7,8,0>>(42);

但在foo中可以使用bar的所有参数。我尝试将功能更改为

template<template<int...> class foo_type, int ... args, typename U>
void bar(U b)

但这根本行不通。我怎样才能做到这一点?如何将bar更改为上述方式并仍然可以访问foo中的参数?基本上我想在运行时对那些列表进行泛型计算

// within the body of bar
constexpr int[sizeof...(args)] = {args...};

其中argsfoo的参数。

2 个答案:

答案 0 :(得分:2)

你是否反对让foo成为一个论点?就个人而言,我喜欢让一切都成为一种争论。只需将其包装成空类型:

template <class T> struct tag_type { using type = T; };
template <class T> constexpr tag_type<T> tag{};

这样您仍然可以在ints...

上模板
template<int... Is, typename U>
void bar(tag_type<foo<Is...>> a, U b) {
    constexpr int stuff[sizeof...(Is)] = {Is...};
    // ...
}

而不是致电bar<foo<6,5,7,8,0>>(42);,而是拨打bar(tag<foo<6,5,7,8,0>>, 42);,这已足够接近。

要准确得到你想要的东西,你可以将前一个呼叫转发给后者:

namespace details {
    template<int... Is, typename U>
    void bar(tag_type<foo<Is...>> a, U b) {
        constexpr int stuff[sizeof...(Is)] = {Is...};
        // ...
    }
}

template <typename foo_type, typename U>
void bar(U b) {
    details::bar(tag<foo_type>, b);
}

现在它是两全其美的。

答案 1 :(得分:0)

我相信,问题是从给定的foo类型中提取模板参数?如果我是对的,这就是解决方案。

您必须部分专门化一个辅助类,如下所示:

template <int ... values>
struct foo { };

template<class T>
struct bar_helper {};

template<int... values> struct bar_helper<foo<values...> > {
  template<class T> static void bar(T ) {
      // Use values... here
  }
};



template<class foo_type, class U>
void bar(U b) {
  bar_helper<foo_type>::bar(b);
}


void check() {
 bar<foo<2, 3, 4, 5, 6> >(42);
}