gpt4 book ai didi

c++ - 从转发函数的类型推断的模板化返回类型

转载 作者:行者123 更新时间:2023-12-01 14:06:13 27 4
gpt4 key购买 nike

我正在尝试编写一个包含调用 main.cpp 中的函数的函数的头文件,转发任意数量的参数。此代码的返回类型需要与转发函数的返回类型匹配。为了实现这一点,我编写了以下虚拟程序,但我无法编译它。我会很感激一些帮助:

#include <functional>
#include <iostream>

double f(double x, int params) {
return 1;
}

template <typename func, typename... Args>
double test(std::function<func(double, Args...)> predicate, Args&&... params){
return 2;
}

int main() {
int dummy = 1;
double result = test(&f, dummy);
std::cout<<result<<std::endl;
return 0;
}

编译器 (clang++-3.8) 给出以下错误:
test.cpp:15:18: error: no matching function for call to 'test'
double result = test(&f, dummy);
^~~~
test.cpp:9:8: note: candidate template ignored: could not match
'function<type-parameter-0-0 (double, type-parameter-0-1...)>' against
'double (*)(double, int)'
double test(std::function<func(double, Args...)> predicate, Args&&... params){
^
1 error generated.

最佳答案

这个怎么样:

#include <utility>

template <typename F, typename ...Args>
auto test(F&& f, Args&&... args)
-> decltype(std::forward<F>(f)(std::forward<Args>(args)...)) {
return std::forward<F>(f)(std::forward<Args>(args)...);
}

用法:
test(f, j, dummy);

在 C++14 中,您可以更简单地将其编写为:
template <typename F, typename ...Args>
decltype(auto) test(F&& f, Args&&... args) {
return std::forward<F>(f)(std::forward<Args>(args)...);
}

关于c++ - 从转发函数的类型推断的模板化返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42820322/

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