问题描述
所以我想将数学函子传递给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 ++中的语法问题:没有在其后放置模板参数的构造函数名称)。