gpt4 book ai didi

C++ - 在模板化函数指针参数调用中确定 foo 的实例

转载 作者:太空狗 更新时间:2023-10-29 21:39:45 26 4
gpt4 key购买 nike

我正在研究函数指针调用和回调,并尝试编写一个可以接受任何函数指针、记录函数调用并在之后调用函数指针的函数。这是向您展示我正在尝试做的事情的代码:

#include<iostream>
#include<string>
#include<functional>

int foo4(std::function<int(int)> Fn, int&& val)
{
return Fn(std::forward<int>(val));
}

template<typename Fn>
int foo5(Fn fn)
{
return 10;
}

template <typename T, typename... args>
T(*LogAndCall(T(*ptr)(args...)))(args...)
{
std::cout << "Logging function call to: " << ptr << " with " << sizeof...(args) << " argument(s)" << std::endl;
return ptr;
}

int main()
{
//call func1
auto r4 = LogAndCall(foo4)([](int&& x) {
return x * 10;
}, 100);
std::cout << "Ret value: " << r4 << std::endl << std::endl;

//call foo5
auto r5 = LogAndCall(foo5<specialization?>)([](int x) { //<--- problem
return x;
});

std::cin.get();
return 0;
}

如您所见,问题在于调用 foo5 时出现以下错误:

看来我需要指定 foo5<something>但问题是,什么? :)

最佳答案

Looks like I need to specify foo5<something> but the question is, what?

对于非捕获的 lambda,您可以强制衰减到指针:

auto r5 = LogAndCall(foo5<int(int)>)([](int x){
// ~~~~~~~^
return x;
});

如果是捕获 lambda,您可以使用类型删除技术:

auto r6 = LogAndCall(foo5<std::function<int(int)>>)([&](int x){
// ~~~~~~~~~~~~~~~~~~~~~~^
return x;
});

或者,您可以将 lambda 存储到一个变量中,以便您可以使用 decltype() 查询其类型说明符:

auto lambda = [&](int x){
return x;
};
auto r7 = LogAndCall(foo5<decltype(lambda)>)(lambda);
// ~~~~~~~~~~~~~~~^

DEMO

关于C++ - 在模板化函数指针参数调用中确定 foo 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32158036/

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