C ++ 11参数打包过载

时间:2016-02-15 06:50:22

标签: c++ c++11

我有一个功能:

template <typename A>
Foo createFoo() {

    std::initializer_list<std::size_t> list = { Object<A>::getIndex() } );
    return Foo(list);
}

它被调用如:

Foo foo = createFoo<Bar>();

它的工作正确,给我一个类Foo的对象。

是否可以编写一个专门的函数,以防有多个参数参数,像这样?

template <typename A1, typename A2, typename...Ax>
Foo createFoo() {

    std::initializer_list<std::size_t> list = { Object<A1>::getIndex(), Object<A2>::getIndex()... } );
    return Foo(list);
}

所以我这样调用它:

Foo foo = createFoo<Bar, Fred, Wilma>();

它给了我一个错误:

  

错误:扩展模式'Object :: getIndex()'不包含参数包

并指向代码的“...”部分。

我不希望将单个函数声明为

template <typename ...A>
Foo createFoo() {

    std::initializer_list<std::size_t> list = { Object<A>::getIndex() } );
    return Foo(list);
}

因为,我们假设Foo类已经优化了逻辑,以防初始化列表中只有一个std::size_t项,我想在我的API中使用它。

我使用GCC版本4.8.4和-std=c++11选项

谢谢。

1 个答案:

答案 0 :(得分:4)

std::initializer_list<std::size_t> list = { Object<A1>::getIndex(), Object<A2>::getIndex()... } );

在函数调用后放置...时,它会在其中查找要扩展的参数包,但A2不是参数包,Ax是。

为什么甚至有A1和A2?

template <typename...Ax>
Foo createFoo() {

然后你可以说Object<Ax>::getIndex()...

或者,如果您必须强制执行一定数量的参数,那么:

std::initializer_list<std::size_t> list = { Object<A1>::getIndex(),Object<A2>::getIndex(), Object<Ax>::getIndex()... } );

...扩展接受一个空参数包,因此这适用于两种或更多类型。