c – 设置std :: function变量以引用std :: sin函数

我有一个关于如何正确使用新的C 11 std :: function变量的问题.我已经看过几个搜索互联网的例子,但它们似乎并没有涵盖我正在考虑的用例.以这个最小的例子为例,其中函数fdiff是在numeric.hxx中定义的有限前向差分算法的实现(这不是问题,我只是想给出一个上下文的原因,为什么我想要任意函数和传递它).
#include <functional>
#include <iostream>
#include <cmath>
#include "numerical.hxx"

int main()
{
    double start = 0.785398163;
    double step  = 0.1;
    int    order = 2;

    std::function<double(double)> f_sin = std::sin;

    std::cout << fdiff(start,step,order,f_sin) << std::endl;

    return 0;
}

试图编译上面的程序给我错误(在clang中)

test.cpp:11:32: error: no viable conversion from '<overloaded function type>' to
      'std::function<double (double)>'
        std::function<double(double)> f_sin = std::sin;
                                      ^       ~~~~~~~~
/usr/lib/gcc/x86_64-unkNown-linux-gnu/4.7.1/../../../../include/c++/4.7.1/functional:2048:7: note: 
      candidate constructor not viable: no overload of 'sin' matching
      'nullptr_t' for 1st argument
      function(nullptr_t) noexcept
      ^
/usr/lib/gcc/x86_64-unkNown-linux-gnu/4.7.1/../../../../include/c++/4.7.1/functional:2059:7: note: 
      candidate constructor not viable: no overload of 'sin' matching 'const
      std::function<double (double)> &' for 1st argument
      function(const function& __x);
      ^
/usr/lib/gcc/x86_64-unkNown-linux-gnu/4.7.1/../../../../include/c++/4.7.1/functional:2068:7: note: 
      candidate constructor not viable: no overload of 'sin' matching
      'std::function<double (double)> &&' for 1st argument
      function(function&& __x) : _Function_base()
      ^
/usr/lib/gcc/x86_64-unkNown-linux-gnu/4.7.1/../../../../include/c++/4.7.1/functional:2092:2: note: 
      candidate template ignored: Couldn't infer template argument '_Functor'
        function(_Functor __f,^
1 error generated.

或者来自g

test.cpp: In function ‘int main()’:
test.cpp:11:45: error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type ‘std::function<double(double)>’ requested

据我所知,这是因为std :: sin是作为标准库中的模板类实现的,但我似乎无法弄清楚我需要做些什么来提供足够的特化来获取函数引用.我也尝试了各种各样的东西,比如使用new auto关键字,使用& std :: sin来获取指针等,但它们都给了我相同类型的错误.

解决方法

std::sin一个重载函数:你必须消除你所指的std :: sin重载的歧义:
std::function<double(double)> f_sin = (double(*)(double))&std::sin;

在某些情况下,编译器可以消除重载函数的歧义(例如,如果f_sin的类型为double(*)(double),则不需要强制转换).但是,这不是其中之一.

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...