gpt4 book ai didi

C++11 参数包重载

转载 作者:太空狗 更新时间:2023-10-29 20:55:33 24 4
gpt4 key购买 nike

我有一个函数:

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

它给我一个错误:

error: expansion pattern ‘Object::getIndex()’ contains no argument packs

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

我不想将单个函数声明为

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 种或更多类型。

关于C++11 参数包重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35403116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com