gpt4 book ai didi

c++ - 将无参数通用 lambda 转换为函数指针

转载 作者:行者123 更新时间:2023-12-05 01:50:23 24 4
gpt4 key购买 nike

我正在尝试将无参数通用 lambda 转换为函数指针。此问题通常适用于通用 lambda,其参数不依赖于模板参数。

示例尝试使用一个类型独立于模板参数 T 的参数 (int) 转换 lambda。

#include <iostream>

int main()
{
auto lambda = []<class T>(int v) -> void
{
std::cout << typeid(T).name() << ' ' << static_cast<T>(v) << '\n';
};

// How do I cast lambda to a function pointer that uses operator(int)<char>
// This doesn't compile, I've reached this conclusion after examining this page https://en.cppreference.com/w/cpp/language/lambda
auto seeked_ptr_char = lambda.operator fptr_t<char>();

// Hacky solution :(
auto mptr_char = &decltype(lambda)::operator()<char>;
decltype(mptr_char) mptr_float = &decltype(lambda)::operator()<float>;

(lambda.*mptr_char)(48);
(lambda.*mptr_float)(52);

// This is okay (tho parameter is dependent on a template argument, which is not what we are looking for)
auto another_lambda = []<class T>(T v) -> void
{
std::cout << v << '\n';
};

void(*ptr_char)(char) = another_lambda;
ptr_char(50);

return 0;
}

不编译x86-64 gcc 12.1 with -std=c++20 -O3

x86-64 clang 14.0.0 -std=c++20 -O3

https://godbolt.org/z/cavbT5jM3

最佳答案

How do I cast lambda to a function pointer that uses operator(int)<char>

TL;DR:你不知道。

首先,函数指针指向函数。模板还不是函数;一个函数模板只有在你为它提供模板参数时才会成为一个函数。函数指针可以指向函数模板的特定实例。但它不能指向函数模板。

从通用 lambda 到函数指针的转换依赖于调用模板转换函数。因此,lambda 有效地具有如下转换函数:

using func = void(int);

template<typename T>
operator func*();

不过,那是一个模板转换函数。由于要转换为的类型不提供模板参数,因此为了调用该函数,您必须显式提供该类型。这意味着您必须显式调用转换函数。

但是根据您编写的代码,您可以解决所有这些问题。这意味着您真正的问题是:

How do I explicitly invoke a template conversion function if the result of the conversion is in no way related to the template parameter(s)?

Lambda 在这里无关紧要。这就是调用一种特殊的模板转换函数。

答案是......显然,你

您可以显式调用类型为 type_name 的转换函数通过object_name.operator type_name()句法。问题是 this line in the standard :

The conversion-type-id in a conversion-function-id is the longest sequence of tokens that could possibly form a conversion-type-id.

问题是如何lambda.operator fptr_t<char>()被解析。看,fptr_t 可能是模板类的名称。因此,fptr_t<char> 可能是该类模板的特化名称。因此fptr_t<char>是“可能形成转换类型 ID 的最长标记序列”。

简而言之,编译器认为您正在尝试调用类型为 fptr_t<char> 的转换函数. fptr_t 没关系不是模板,编译器可以环顾四周并弄清楚。解析发生在任何此类思考之前。所以解析规则优先。整个fptr_t<char> text 作为转换函数的类型名。

这一切意味着,除非转换函数的模板参数可以从被转换为单独的类型中推导出来,否则似乎不可能调用这样的转换函数。这样的转换函数可以存在;你可以声明这样的功能就好了。但是 C++ 缺少任何与它实际交互的语法。

具有无法从函数参数推导的模板参数的 lambda 不是特别有用的另一个原因。

关于c++ - 将无参数通用 lambda 转换为函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73160854/

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