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

C++ 从转发函数的类型推断的模板化返回类型,c++,c++11,variadic-templates,std-function,perfect-forwarding,C++,C++11,Variadic Templates,Std Function,Perfect Forwarding,我试图编写一个头文件,其中包含一个调用main.cpp内函数的函数,并转发任意数量的参数。此代码的返回类型需要与转发函数的返回类型匹配。为了实现这一点,我编写了以下虚拟程序,但我无法编译它。我将非常感谢您的帮助: #include <functional> #include <iostream> double f(double x, int params) { return 1; } template <typename func, typename..

我试图编写一个头文件,其中包含一个调用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;
}
#包括
#包括
双f(双x,int参数){
返回1;
}
模板
双重测试(std::函数谓词、参数和参数){
返回2;
}
int main(){
int-dummy=1;
双结果=试验(f,假人);
std::cout这个怎么样:

#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)...);
}
在C++14中,您可以更简单地将其编写为:

template <typename F, typename ...Args>
decltype(auto) test(F&& f, Args&&... args) {
  return std::forward<F>(f)(std::forward<Args>(args)...);
}
模板
decltype(自动)测试(F&&F,Args&&…Args){
返回std::forward(f)(std::forward(args)…);
}

请删除所有不必要的代码和注释,并添加编译器提供给您的准确错误消息,以提出问题。谢谢,这非常有帮助,我在帖子中没有提到的是,标题引入了一个新变量,该变量将传递给转发函数。我尝试了
模板自动测试(F&&F,Args&&…Args)->decltype(std::forward(f)(double,std::forward(args)…){double x=3.2;return std::forward(f)(x,std::forward(args);}
但是我现在得到了编译器错误
test.cpp:16:42:错误:对于函数样式转换或类型构造->decltype(std::forward(f)(double,std::forward(args)…)){
@AlexD:
decltype(std::forward(f)(42,std::forward(args)…)
decltype(std::forward(f)(std::declval(),std::forward(args))
@Jarod42谢谢,明白了:)@AlexD:将来,请提出代表您实际问题的问题,以便您可以使用答案得出解决方案:-)
test(f, j, dummy);
template <typename F, typename ...Args>
decltype(auto) test(F&& f, Args&&... args) {
  return std::forward<F>(f)(std::forward<Args>(args)...);
}