我想实现这样的目标:
void mycallback(auto v)
{
for (auto x : v) {
std::cout << x << '\n';
}
}
void f(auto cb) {
cb(std::vector<int>{44,55,66});
cb(std::vector<int>{123, 234, 345} | std::ranges::views::drop(1));
}
void run()
{
f(mycallback);
f([](auto v) {
for (auto x : v) {
std::cout << x << '\n';
}
});
}
mycallback()
应接受 C++20 范围内的整数。更具体地说,我需要带有各种过滤器的 owning_view
。所以它是一个模板。我需要将此回调传递给 f() ,它可以使用不同的范围类型调用回调。我需要它主要接受 lambda。 f()
无法实例化,因为编译器不知道如何推断类型,因为 f()
函数内部需要回调实例化。
test.cpp:34:6: note: template argument deduction/substitution failed:
test.cpp:41:6: note: couldn’t deduce template parameter ‘auto:25’
41 | f(mycallback);
是否有一些延迟实例化选项?
最佳答案
您可以传递一个调用回调的 lambda。
为了使回调能够处理范围,请将签名更改为 auto&& v
,以便它可以接受右值引用作为参数。
#include <iostream>
#include <ranges>
#include <vector>
void mycallback(auto&& v) {
for (auto x : v) {
std::cout << x << " ";
}
std::cout << "\n";
}
void f(auto cb) {
cb(std::vector<int>{44, 55, 66});
cb(std::vector<int>{123, 234, 345} | std::ranges::views::drop(1));
}
int main() {
f([](auto&& v) { return mycallback(v); });
}
关于C++ 传递带有范围参数的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74900269/