C++ 传递带有范围参数的回调

标签 c++ templates callback std-ranges

我想实现这样的目标:

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,以便它可以接受右值引用作为参数。

[Demo]

#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/

相关文章:

c++ - 派生类中的方法调用列表

javascript - 如何在我的代码中实现回调/等待?

c++ - 非STL函数对象回调使用

c++ - C++ 中带有 std::for_each 的仿函数

C++从char数组到BCD

c++ - 尝试使用另一个类模板部分特化类模板时 VS2013 出错

c++ - 如何从 `decltype(<funtion>)` 获取函数参数的数量?

c++ - union 中的大括号或相等初始化器

c++ - 在整个函数中保持相同的 vector 以进行添加和删除

javascript - 迭代中的异步函数 - javascript