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

标签 c++ c++17

我有一个代码,可以输入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/

相关文章:

c++ - Constexpr 函数作为 SFINAE 的模板参数

c++ - g++ std::set 找不到为类定义的运算符<

c++ - 如何将 Boost multi_array 传递给函数?

c++ - std::vector<std::wstring> 移动/重新分配内部 wstring.data() 合法吗?

c++ - 如何使用 C++14 和 C++1z 中的功能缩短此可变参数模板代码?

c++ - 即使 XZY 具有非复制约束,构造助手 make_XYZ 也允许 RVO 和类型推导

c++ - 避免使用虚方法构造具有空基类的构造函数

android - cocos2d-x中tableview的cell touch误操作

c++ - 需要澄清#ifndef#define

c++ - 我正在尝试创建一个使用C++中的参数包构造函数的异常类