gpt4 book ai didi

c++ - 如何在 c++17 中传递 Callable 对象以与 std::invoke 一起使用

转载 作者:行者123 更新时间:2023-12-02 04:59:02 25 4
gpt4 key购买 nike

为什么将 i 传递给构造函数时无法编译以下内容。其他类似的结构可以编译。

#include <iostream>
#include <functional>

int RetXPrintU(int x, uint u)
{
std::cout << "RetXprintU(): " << u << std::endl;
return x;
}

template <typename Fn, typename... Args>
void Call(Fn&& fun, Args&&... args)
{
std::invoke(std::forward<Fn>(fun), std::forward<Args>(args)...);
}

template <typename Fn, typename... Args>
class CallableObj
{
public:
explicit CallableObj(Fn&& fun, Args&&... args)
{
std::invoke(std::forward<Fn>(fun), std::forward<Args>(args)...);
}
};

int main() {
int i = 4;
std::invoke(RetXPrintU, i, 8u);
Call(RetXPrintU, i, 8u);
CallableObj co(RetXPrintU, i, 8u); // WHY I DO NOT COMPILE?
//CallableObj co(RetXPrintU, 0, 8u); // WHY I COMPILE?

return 0;
}

最佳答案

这里的问题是您需要将模板从类移动到构造函数。当你有

template <typename Fn, typename... Args>
class CallableObj
{
public:
explicit CallableObj(Fn&& fun, Args&&... args)
{
std::invoke(std::forward<Fn>(fun), std::forward<Args>(args)...);
}
};

Args&&... 不是可变参数转发引用,因为它是为类本身推导的,当您调用 CallableObj co(RetXPrintU, i, 8u); 时类被实例化,构造函数被标记为

explicit CallableObj(int(int, unsigned int)&& fun, int&& arg1, unsigned int&& arg2)

我们想要的是

class CallableObj
{
public:
template <typename Fn, typename... Args>
explicit CallableObj(Fn&& fun, Args&&... args)
{
std::invoke(std::forward<Fn>(fun), std::forward<Args>(args)...);
}
};

现在,当调用构造函数时,将推导出 Args,并且 Args&& 现在是转发引用。

CallableObj co(RetXPrintU, 0, 8u); 在您的示例中起作用的原因是因为 0 是纯右值,并且纯右值可以绑定(bind)到右值引用。

关于c++ - 如何在 c++17 中传递 Callable 对象以与 std::invoke 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59736558/

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