模板。参数包扩展 - 重映射类型

时间:2017-04-13 11:56:25

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

是否可以在参数包扩展期间重新映射列表中的类型?

假设我们有下一个类型,我们想用作模板参数:

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);

有可能吗?

1 个答案:

答案 0 :(得分:3)

是的,这很简单:

template <typename... Args>
struct Foo {
    void bar(typename Args::type... a) {}
};

[Live example]

[看来基]

请注意,这是一个不使用复数命名参数包的好理由;实际编写参数包的所有用法,使包名称代表包的单个元素,并使用...进行扩展。

[/看来基]