这是什么意思:'std :: ios_base&(*f)(std :: ios_base&))'

use*_*840 3 c++

我一直在寻找将字符串转换为int的最佳方法,我遇到了一个我不理解的函数:

template <class T>
bool from_string(T& t, 
                 const std::string& s, 
                 std::ios_base& (*f)(std::ios_base&))
{
  std::istringstream iss(s);
  return !(iss >> f >> t).fail();
}
Run Code Online (Sandbox Code Playgroud)

我知道模板是什么,我不知道它意味着什么:

std::ios_base& (*f)(std::ios_base&)
Run Code Online (Sandbox Code Playgroud)

这里是否创建了一个新指针,为什么括号中的两个表达式彼此相邻?

Jam*_*nze 5

它是一个指向函数的指针,该函数将a std::ios_base&作为参数,并返回一个std::ios_base&.

事实上,它是操纵者的一种形式,不带任何论据.<<这种类型的重载只是调用函数; 然后该函数在流上执行任何它喜欢的操作,返回它.因此可以通过以下方式调用您的函数:

from_string( anInt, "0A", &std::hex );
Run Code Online (Sandbox Code Playgroud)