gpt4 book ai didi

c++ - 如何将函数传递给模板函数 A,该函数可能具有基于 A 的另一个参数的不同签名?

转载 作者:太空狗 更新时间:2023-10-29 20:36:09 25 4
gpt4 key购买 nike

我想使用一个类型创建一个模板,并传递一个函数,该函数的模板参数包含该类型。

这是我目前拥有的:

#include <iostream>

void fooRef(int& ref) { std::cout << "In ref" << std::endl; }
void fooPtr(int* ptr) { std::cout << "In ptr" << std::endl; }

template<typename T, typename F>
void Print(T arg, F func) {
//DoABunchOfStuff();
func(arg);
//DoSomeMoreStuff();
}

int main() {
int x = 5;
int& ref = x;

Print<int*, void(*)(int*)>(&x, &fooPtr);
Print<int&, void(*)(int&)>(ref, &fooRef);
}

这行得通,但我觉得函数的调用者可能会有些冗长。理想情况下,我希望通话看起来像这样:

Print<int*, fooPtr>(ptr);
Print<int&, fooRef>(ref);

有没有办法简化对 Print 函数的调用?

最佳答案

Is there a way to simplify the calls to the Print function?

是的。您所做的根本不是指定模板类型。函数模板经过一个过程调用 template argument deduction .在此过程中,传递给函数的参数会推导出它们的类型,编译器会尝试将其与模板参数相匹配。如果有效,则该函数将被清除,编译器将继续。所以对于你的代码,如果我们使用

int main() {
int x = 5;
int& ref = x;

Print(&x, &fooPtr);
Print(std::ref(ref), &fooRef);
}

然后我们得到

In ptr
In ref

Live Example

在第二次调用中,我使用了 std::ref 所以它实际上会通过引用传递 ref。否则它会复制 ref 所指的内容。

关于c++ - 如何将函数传递给模板函数 A,该函数可能具有基于 A 的另一个参数的不同签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39708538/

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