C++11 参数包重载
C++11 parameters pack overload
我有一个函数:
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 种或更多类型。
相关文章:
- 错误 没有与参数列表匹配的重载函数"getline"实例
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 运算符重载:"operator+"必须采用零个或一个参数
- 参数相关查找和流运算符重载
- 为私有结构定义双参数运算符重载
- 具有std::initializer_list参数的非成员函数(/non构造函数上下文)的重载解析
- C++派生类重载函数(带有 std::function 参数)不可见
- 基于模板参数的重载解析
- 可变参数泛型 lambda 和函数重载
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 具有参数包和通用引用的重载选择
- 重载参数 C++ 是个好主意吗?
- 无法使用 ostream << 字符串流重载 参数 1 没有已知的转换
- 重载参数类型和返回类型上的函数
- C++ 运算符重载参数与普通参数
- 可以用变量no的函数.在vc++中可以重载参数
- 在操作符重载参数列表中包含const会产生错误(c++)