gpt4 book ai didi

c++ - 如何将特定回调传递给模板函数?

转载 作者:太空狗 更新时间:2023-10-29 19:51:18 25 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>
using namespace std;
template <class T>

int get_num(int k) {
return k + 3;
}

float get_num(float k) {
return k + 3;
}


template <class T1, class T2>
void function(T1 (*callback)(T2), T2 arg) {
callback(arg);
}

int main() {
// your code goes here
function(get_num, 3);
return 0;
}

我需要使用 int 参数调用 get_num() 函数。但是编译器得到这个错误:

prog.cpp: In function ‘int main()’: prog.cpp:21:21: error: no matching
function for call to ‘function(<unresolved overloaded function type>,
int)’ function(get_num, 3);
^ prog.cpp:15:6: note: candidate: template<class T1, class T2> void function(T1 (*)(T2), T2) void function(T1
(*callback)(T2), T2 arg) {
^~~~~~~~ prog.cpp:15:6: note: template argument deduction/substitution failed: prog.cpp:21:21: note: couldn't deduce
template parameter ‘T1’ function(get_num, 3);

如何做到?

最佳答案

删除后template <class T>来自 int get_num(int)要获得正常的过载集,您可以使用 Some programmer dude’s answer .

在这个答案中,我想详细说明如何仍然可以使用基于函数指针的参数。

如果将参数切换为 function至少gcc is able to deduce it :

template <typename T, typename U>
void function2(T arg, U(*callback)(T)) {
callback(arg);
}

当您使用 U 时,clang 不喜欢它在那里,所以如果你的返回类型总是与你的参数相同,you can use T twice :

template <typename T>
void function2(T arg, T(*callback)(T)) {
callback(arg);
}

要解决一般错误消息中的歧义,您还可以 do the overload resolution manuallystatic_cast :

function(static_cast<float(*)(float)>(&get_num), 3.0f);
function(static_cast<int(*)(int)>(&get_num), 3);

关于c++ - 如何将特定回调传递给模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49149934/

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