C ++-在传递给`std :: function`时指定重载的函子或函数

问题描述

所以我想将数学函子传递给std::function

    std::function< double( double ) > squareRoot( std::sqrt );

我收到一条错误消息,说它无法解决MSVC和GCC上的过载。但这行得通

    std::function< double( double ) > squareRoot( ( double( * )( double ) ) std::sqrt );
    std::cout << squareRoot( 4.0 ) << "\n";

如果我们传递函子的地址,这通常会起作用

    std::function< double( double ) > squareRoot( ( double( * )( double ) ) &std::sqrt );
    std::cout << squareRoot( 4.0 ) << "\n";

后面两个(平凡的)程序都产生有效的输出

在将函子传递给std::function之类的东西时,指定函子的特定重载的正确方法是什么(奖励,如果有人可以解释模板参数语法,尤其是与此有关的话)?

更新0

以下内容适用于GCC,但不适用于MSVC,因此我正在更新标题包括功能

std::function< double( double ) > squareRoot( sqrt );

更新1

前面的示例在GCC和MSVC下均适用,仅包含<cmath>,但后面仅包含<math.h>时不包含。我不确定我实际上是在处理函数还是函子。

解决方法

您完成操作的方式(将import pandas as pd import numpy as np df = pd.DataFrame({'A' : [1,2,3,0],'B' : [2,4,5]}) df['C'] = df['B'] / df['A'] df['D'] = df['A'] / df['B'] df = df.replace(np.inf,np.nan) df['C'].mean(),df['D'].mean() Out[3]: (1.611111111111111,0.47916666666666663) 投射到所需的特定函数指针类型)是选择所需特定重载的正确方法。如您所见,无论有没有显式def matrix(): row = int(3) column = int(3) matrix_input = [] print("Enter the entries in a single line (separated by space): ") for i in range(row): # A for loop for row entries # ints = input().split() while True: ints = input().split() if len(ints) == 3: break print("Invalid Input Received") print("Enter the entries in a single line (separated by space): ") entries = [] for a in ints: entries.append(int(a)) matrix_input.append(entries) print("Output") for ele in matrix_input: for d in ele: print(d,end=' ') print('') ,它都可以工作。为了避免意外执行std::sqrt,使用&比使用C样式转换更好。

这里没有需要注意的特殊模板参数语法。 static_cast<double(*)(double)>不是模板,因此尝试指定模板参数(如reinterpret_cast)是不正确的。您也不能显式指定std::sqrt构造函数的模板参数(这是C ++中的语法问题:没有在其后放置模板参数的构造函数名称)。