gpt4 book ai didi

c++ - C++ 20 'familiar template' lambdas:在函数指针转换中指定显式参数

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

假设我在C++ 20中具有以下代码,使用P0428中引入的显式模板参数lambda功能:

auto f = []<auto val>(int a) { printf("%d", val + a); };
考虑到以下代码是非法的,并且我需要将函数λ转换为具有显式专门值的lambda f(我需要在其中使用显式C ABI链接,成员函数调用将导致不同的参数传递寄存器)。
using intfn = void(*)(int);
f.template operator intfn<400>(); // illegal
f.template operator()<400>(0); // legal, but not what I need: is a member function call
(查看 Is it possible to call templated user-defined conversion operator with explicit template arguments?的答案)
...还有其他方法可以获取当前C++语言中的函数指针,例如通过使用某种隐式转换?

最佳答案

您可以利用以下事实:非捕获lambda在c++ 20中是默认可构造的。

#include <iostream>
#include <tuple>

template <typename F>
struct args_tuple_maker;

template <auto P, typename F, typename... Args>
auto make_function_pointer(F, std::tuple<Args...>) {
return +[](Args... args){ F{}.template operator()<P>(std::forward<Args>(args)...); };
}

int main() {
auto f = []<auto val>(int a) { printf("%d", val + a); };

auto f_ptr = make_function_pointer<200>(f, std::tuple<int>{});

static_assert(std::is_same_v<decltype(f_ptr), void(*)(int)>, "");

f_ptr(5);
}
这不是一个完美的解决方案,但可能与您现在所能达到的程度相近。可能可以改进以从lambda类型推断参数。

关于c++ - C++ 20 'familiar template' lambdas:在函数指针转换中指定显式参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64497320/

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