假设我们有一个班级
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...};
其中args
是foo
的参数。
答案 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);
}