C++11 参数包重载

C++11 parameters pack overload

本文关键字:重载 参数 包重载 C++11      更新时间:2023-10-16

我有一个函数:

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

它给了我一个错误:

错误:扩展模式"对象::getIndex(("不包含参数包

并指向"..."部分代码。

我不想将单个函数声明为

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

因为,假设 Foo 类具有优化的逻辑,以防initializer_list中只有一个std::size_t项,并且我想在我的 API 中使用它。

我使用带有-std=c++11选项的 GCC 版本 4.8.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()... } );

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