gpt4 book ai didi

c++ - 模板回调的包装器?

转载 作者:太空狗 更新时间:2023-10-29 23:43:38 24 4
gpt4 key购买 nike

立即回调

考虑以下示例:

template <typename lambda> void call_me_back(const lambda & callback)
{
// Very complicated calculation to find the meaning of everything

callback(42);
}

int main()
{
call_me_back([](const int & value)
{
std :: cout << value << std :: endl;
});
}

这里我提供call_me_back使用接受 int 的 lambda . call_me_back电话 callback经过长时间的计算,callback打印出来。像蛋糕一样简单。

现在,根据执行情况,call_me_back需要调用callback或者是 int或其他类型。我们可以将前面的示例编辑为

template <typename lambda> void call_me_back(const lambda & callback)
{
// Very complicated calculation to find the meaning of everything

if(rand() % 2)
callback(42);
else
callback("Kill all the humans.");
}

int main()
{
call_me_back([](const auto & value)
{
std :: cout << value << std :: endl;
});
}

到目前为止一切顺利。现在callback可以做各种技巧和处理value取决于它的类型。

延迟回调

现在,回到第一个例子。说call_me_back还没准备好马上打电话callbackint .然而,它可以做的是存储 callback某个地方,然后稍后调用它。

例如:

std :: function <void(const int &)> the_callback;

template <typename lambda> void call_me_back(const lambda & callback)
{
the_callback = callback;
}

void ready_to_answer()
{
the_callback(42);
}

int main()
{
call_me_back([](const auto & value)
{
std :: cout << value << std :: endl;
});
}

现在,不是立即调用 callback , call_me_back商店 callbackstd :: function <void(const int &)>对象(我知道,它在全局范围内,请耐心等待)。然后会发生很多事情,在某个时候有人可以调用ready_to_answer ,它检索先前存储的回调并调用它。例如,ready_to_answer可以由另一个线程调用,但是有很多原因需要这样的范例,其中可以存储回调并在以后调用。

问题

如果我想实现第二个示例,但使用延迟回调怎么办?。我似乎无法理解这一点。

我可以想象std :: function使用接受某种特定类型的虚拟调用运算符实现。 std :: function然后将指针/引用包装到存储实际 lambda 的模板包装器类,并通过将其参数转发到它存储的 lambda 来实现调用运算符。好,易于。 但我不能有模板虚拟方法!

我尝试过各种解决方案,但找不到任何可行的方案。这真的不可能吗?是否不可能有一些外部提供的 lambda 接受 const auto &参数存储在某处,然后稍后调用它?

最佳答案

你是对的,无限类型集是不可能的,但如果你事先知道所有类型,你就可以做到:

std :: function <void(const std :: variant<int, std :: string> &)> the_callback;

template <typename lambda> void call_me_back(const lambda & callback)
{
the_callback = [callback](const auto & arg)
{
std :: visit(callback, arg);
};
}

template <typename T> void ready_to_answer(const T & x)
{
the_callback(x);
}

int main()
{
call_me_back([](const auto & value)
{
std :: cout << value << std :: endl;
});

if (std :: rand() % 2)
{
ready_to_answer(42);
}
else
{
ready_to_answer("Hi!");
}
}

关于c++ - 模板回调的包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44999142/

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