iomanip 函数是如何实现的?
How are iomanip functions Implemented?
一些标准 iomanip
函数接受一个参数。
我想知道这是如何实现的,例如,我可以用一个函数做类似的事情吗?这确实是我 需要的解决方案,但我不知道该怎么做。
当我在 http://en.cppreference.com 中查找 setw
函数的定义时,它将 return 类型列为“未指定”,并且它也只列出了一个参数,而不是还采用 stream&
参数。这是如何工作的?
注意reader:
这个问题有但是给查这个问题的人;此答案仅在与 ios_base
:
提供的以下功能结合使用时才有用
这是一个用户定义的操纵器的简单示例,它采用一个使用 class 定义的参数:
#include <iostream>
class putX // injects some `X`s into the stream
{
std::size_t _n;
public:
explicit putX(std::size_t n): _n(n) {}
std::size_t getn() const {return _n;}
friend std::ostream& operator<<(std::ostream& os, const putX& obj)
{
std::size_t n = obj.getn();
for (std::size_t i = 0; i < n; ++i)
os << 'X';
return os;
}
};
int main()
{
std::cout << putX(10) << " test " << putX(10);
}
不带参数的操纵器可以简单地实现为
std::ostream& custom_manip(std::ostream& os) { // do something with os and return os;}
那是因为 basic_ostream::operator<<
有一个重载,它将指向函数的指针 std::ostream& (*fp)(std::ostream&)
作为其右侧(例如,操纵器)
PS:N. Josuttis 的 C++ 标准库 详细描述了 manipulators/custom 操纵器的工作原理,请参阅第 2 节。 15.6.3 用户定义的操纵器
一些标准 iomanip
函数接受一个参数。
我想知道这是如何实现的,例如,我可以用一个函数做类似的事情吗?这确实是我
当我在 http://en.cppreference.com 中查找 setw
函数的定义时,它将 return 类型列为“未指定”,并且它也只列出了一个参数,而不是还采用 stream&
参数。这是如何工作的?
注意reader:
这个问题有ios_base
:
这是一个用户定义的操纵器的简单示例,它采用一个使用 class 定义的参数:
#include <iostream>
class putX // injects some `X`s into the stream
{
std::size_t _n;
public:
explicit putX(std::size_t n): _n(n) {}
std::size_t getn() const {return _n;}
friend std::ostream& operator<<(std::ostream& os, const putX& obj)
{
std::size_t n = obj.getn();
for (std::size_t i = 0; i < n; ++i)
os << 'X';
return os;
}
};
int main()
{
std::cout << putX(10) << " test " << putX(10);
}
不带参数的操纵器可以简单地实现为
std::ostream& custom_manip(std::ostream& os) { // do something with os and return os;}
那是因为 basic_ostream::operator<<
有一个重载,它将指向函数的指针 std::ostream& (*fp)(std::ostream&)
作为其右侧(例如,操纵器)
PS:N. Josuttis 的 C++ 标准库 详细描述了 manipulators/custom 操纵器的工作原理,请参阅第 2 节。 15.6.3 用户定义的操纵器