嵌套参数包扩展失败
Nested parameter pack expansion fails
我正在尝试编写一个作为输入的转换函数
- 一个函子,这些参数的数量与输入
tuple
S 的数量相同。 - 任意数量的
tuple
并输出转换后的tuple
。
我们假设输入元组具有相同的类型。
例如,以下代码片段应执行元组的加号运算,从而产生{5, 7, 9}
tuple
。
auto t = transform(
[](auto i, auto j) {
return i + j;
},
std::make_tuple(1, 2, 3),
std::make_tuple(4, 5, 6));
代码:
#include <tuple>
#include <type_traits>
#include <iostream>
template <size_t idx, typename... Ts>
using get_nth_type = std::tuple_element_t<idx, std::tuple<Ts...>>;
template <typename Func, size_t... indices, typename... Ts>
auto transform(Func f, std::index_sequence<indices...>, Ts&&... input) {
return std::make_tuple(f(std::get<indices>(std::forward<Ts>(input))...)...);
}
template <typename Func, typename... Ts>
auto transform(Func f, Ts&&... input) {
return transform(f, std::make_index_sequence<std::tuple_size<get_nth_type<0, Ts...>>::value>(),
std::forward<Ts>(input)...);
}
int main() {
auto t = transform(
[](auto i, auto j) {
std::cout << i + j << 'n';
return -i;
},
std::make_tuple(1, 2, 3), std::make_tuple(4, 5, 6));
// Desired output: 5
// 7
// 9
std::cout << std::get<0>(t) << ", " << std::get<1>(t) << ", " << std::get<2>(t);
// Desired output: -1
// -2
// -3
}
错误消息:
error: pack expansion does not contain any unexpanded parameter packs
return std::make_tuple(f(std::get<indices>(std::forward<Ts>(inputs))...)...);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
似乎indices
和input
的扩展顺序错误。但是我无法弄清楚正确的方法是什么。
在这里尝试一下
问题是您希望通过第一个包扩展来扩展Ts
/input
包,通过第二个包扩展来扩展indices
包,但是indices
和Ts
/input
都显示为第一个包扩展的操作数的一部分,因此它们与第一个扩展并行扩展, 没有为第二个留下任何扩展。
您可以通过在另一个函数调用中执行第一个扩展和在函数调用外部执行第二个扩展来避免这种情况:
template <std::size_t index, typename Func, typename... Ts>
decltype(auto) transform_impl(Func& f, Ts&&... input) {
return f(std::get<index>(std::forward<Ts>(input))...);
}
template <typename Func, size_t... indices, typename... Ts>
auto transform(Func f, std::index_sequence<indices...>, Ts&&... input) {
return std::make_tuple(transform_impl<indices>(f, std::forward<Ts>(input)...)...);
}
请参阅 https://wandbox.org/permlink/c9YquHFlWlFYM0KN。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- 嵌套参数包扩展失败
- 将源文件扩展名从 .m 更改为 .mm 在屏幕保护程序项目的 Xcode 9.3 中失败
- vkGetInstanceProcAddress 在调试报告扩展上失败
- VS2017 RC而不是VS2015,Variadic模板包扩展失败
- COM 外壳扩展以覆盖"Run as Administrator"在"开始"菜单搜索中失败
- 加载挡板扩展失败
- 在Visual Studio 2017中,通过扩展每个参数包来呼叫基类成员失败
- Vulkan-加载扩展时实例创建失败
- 传递引用时模板扩展失败
- 在重载函数上构建Python C++扩展失败
- 包扩展失败与g++4.9.0,但工作与clang++3.4
- 逻辑扩展文件失败