gpt4 book ai didi

c++ - 将模板函数作为普通函数的参数传递

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:30 25 4
gpt4 key购买 nike

我想知道是否可以将模板函数(或其他)作为参数传递给第二个函数(不是模板)。向 Google 询问这件事似乎只会提供相反的信息 (Function passed as template argument)

我能找到的唯一相关页面是 http://www.beta.microsoft.com/VisualStudio/feedbackdetail/view/947754/compiler-error-on-passing-template-function-as-an-argument-to-a-function-with-ellipsis(不是很有帮助)

我期待这样的事情:

template<class N>void print(A input){cout << input;}
void execute(int input, template<class N>void func(N)){func(input)}

然后调用

execute(1,print);

那么,这可以做到吗,还是必须为 execute() 定义另一个模板?

最佳答案

函数模板代表一个无限重载集,因此除非您有一个与特化兼容的目标类型,否则函数类型的推导总是失败。例如:

template<class T> void f(T);
template<class T> void h(T);

void g() {
h(f); // error: couldn't infer template argument 'T'
h(f<int>); // OK, type is void (*)(int)
h<void(int)>(f); // OK, compatible specialization
}

从上面我们可以看出程序的有效性要求我们为函数模板指定模板参数,而通常指定它们并不总是直观的。您可以改为使 print 具有通用重载调用运算符的仿函数作为额外的间接级别:

struct print {
template<typename T>
void operator()(T&& x) const {
std::cout << x;
}
};

现在您可以让 execute 接受任何 Callable 并使用输入调用它:

template<class T, class Op>
void execute(T&& input, Op&& op) {
std::forward<Op>(op)(std::forward<T>(input));
}

void g() { execute(1, print{}); }

通用的 lambdas (C++14) 使它更加简洁:

execute(1, [] (auto&& x) { std::cout << x; });

关于c++ - 将模板函数作为普通函数的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30855193/

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