是否可以在参数包扩展期间重新映射列表中的类型?
假设我们有下一个类型,我们想用作模板参数:
struct A {
typedef char type;
};
struct B {
typedef float type;
};
struct C {
typedef void* type;
};
这是课堂模板:
template <typename... Args>
struct Foo {
// after expansion should be
// void bar(Arg0::type, Arg1::type, Arg2::type, ...)
void bar(/* expand Args here */) {}
};
我们应该以何种方式展开Args
以获取Foo::bar(Arg0::type, Arg1::type, Arg2::type, ...)
?
Foo<A, B, C> f;
// now there should be method void f::bar(A::type, B::type, C::type)
f.bar('a', 1.f, nullptr);
有可能吗?
答案 0 :(得分:3)
是的,这很简单:
template <typename... Args>
struct Foo {
void bar(typename Args::type... a) {}
};
[看来基]
请注意,这是一个不使用复数命名参数包的好理由;实际编写参数包的所有用法,使包名称代表包的单个元素,并使用...
进行扩展。
[/看来基]