gpt4 book ai didi

c++ - C++:将lambda作为带有模板参数的函数进行传递会使推导模板类型失败

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

在作为参数传递的函数参数中使用模板类型(作为std::function或作为函数指针)会使编译器无法在以lambda形式传递函数时推断出类型(请参见下面的代码)。有趣的是,如果该函数不是lambda,则此方法有效。

有什么办法可以做到这一点?我已经在Visual Studio 2017和GCC 7.4中尝试了以下代码,但都失败了,因此不太可能是编译器错误,并且可能是这种行为的原因。

#include <iostream>
#include <functional>

template <typename T>
void collide(void (*callback)(T)) // or std::function<void(T)> callback
{
callback(42);
}

int main() {
// doesn't compile: "could not deduce template arguments"
collide([](int a) {
std::cout << a << std::endl;
});
}

最佳答案

尝试使用以下电话

collide( *[](int a) {
std::cout << a << std::endl;
});

将lambda转换为显式指向函数的指针。

这是一个演示程序。
#include <iostream>

template <typename T>
void f( void ( *fn )( T ) )
{
fn( 42 );
}

void g( int x )
{
std::cout << "g( " << x << " );\n";
}

int main()
{
f( g );
f( *[]( int x ) { std::cout << "main::lambda( " << x << ");\n"; } );
}

它的输出是
g( 42 );
main::lambda( 42);

关于c++ - C++:将lambda作为带有模板参数的函数进行传递会使推导模板类型失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59760946/

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