gpt4 book ai didi

C++17 模板参数推导失败

转载 作者:行者123 更新时间:2023-12-03 07:00:25 25 4
gpt4 key购买 nike

我想模拟计时器,它会定期调用一个函数(回调),因为我写了以下代码片段(虽然很幼稚),其中,
参数推导在主函数中的 Timer/ /.. 行失败。我正在用 c++17 std 编译这段代码。我该如何解决这个问题?或者那些必要的论点?
在这方面的任何帮助表示赞赏。

#include <functional>
#include <chrono>

using namespace std::chrono_literals;

template<typename ...Args>
class Timer
{
public:
Timer(std::function<void(Args...)> func, Args&&... args, std::chrono::milliseconds step)
: m_callback{ func },
m_args{ std::forward<Args>(args)... },
m_time{ step },
m_stop{ false },
{ }

private:
std::function<void(Args...)> m_callback;
std::thread m_executer;
std::tuple<Args...> m_args;
std::chrono::milliseconds m_time;
bool m_stop;
};

int main()
{
// Create a timer
auto timer = Timer/*<int, int, float>*/([](int a, int b, float c) { }, 15, 17, 12.0f, 500ms);

return 0;
}

最佳答案

这里模板参数推导有两个问题。 std::function无法从 lambda 参数中推导出参数,推导仅适用于尾随参数包。
要解决此问题,您可以更改构造函数的参数顺序,如下所示:

Timer(std::function<void(Args...)> func, std::chrono::milliseconds step, Args&&... args)
// ... // ^^^^^^^^^ trailing
并添加扣除指南
template<typename Func, typename ...Args>
Timer(Func, std::chrono::milliseconds, Args&&...) -> Timer<Args...>;
这是一个 demo .
请注意警告,您的成员初始值设定项列表与成员声明的顺序不同。

关于C++17 模板参数推导失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64584867/

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