gpt4 book ai didi

c++ - 使用其类型而不是其实例调用不捕获

转载 作者:行者123 更新时间:2023-12-02 09:51:19 24 4
gpt4 key购买 nike

我有一个代码,可以输入lambda的类型,但没有其实例,我想调用它
我尝试了以下操作,显然,它不起作用,因为operator()不是静态成员函数...

#include <utility>

template<typename F, typename ...Args>
void call(F, Args&&... args) {
&F::operator()(std::forward<Args>(args)...);
}

int main() {
auto is_odd = [](auto x) {return x % 2 == 1;};
call(is_odd, 5);
}
我也尝试使用以下命令将其转换为函数指针:
template<typename F, typename ...Args>
void call(F, Args&&... args) {
using return_type = decltype(std::declval<F>()(std::declval<Args&&>()...));
using ptr = return_type(*)(Args...);
ptr f = static_cast<ptr>(&F::operator());
f(std::forward<Args>()...);
}
但这也不起作用。可以做这样的事情吗?

最佳答案

在您的示例中,您确实有一个实例。您将其传递给函数,只是该参数未命名。解决方法很简单:命名参数并使用该参数:

template<typename F, typename ...Args>
void call(F f, Args&&... args) {
f(std::forward<Args>(args)...);
}

int main() {
auto is_odd = [](auto x) {return x % 2 == 1;};
call(is_odd, 5);
}

如果出于任何原因,您确实处于没有实例的上下文中,那么除非您可以使用C++ 20,否则它们很不走运。在C++ 20之前,默认情况下无法构造lambda,因此无法使用其类型创建实例。使用C++ 20,您可以:

template <typename F, typename... Args>
void call(Args&&... args)
{
F{}(std::forward<Args>(args)...);
}

int main()
{
auto is_odd = [](auto x) { return x % 2 == 1; };
call<decltype(is_odd)>(5);
}

关于c++ - 使用其类型而不是其实例调用不捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64400847/

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