c++ - 如何为多个流操作创建别名?

标签 c++ c++98

有没有办法在 C++98 中为下面的行创建一个速记别名?

std::precision(3) << std::fixed

然后使用别名如下:

std::cout << alias << 3.1415926 << std::endl;

最佳答案

标准方法可能是创建自定义操纵器:

std::ios_base& alias(std::ios_base& str) {
    str.precision(3);
    return std::fixed(str);
}

然后:

std::cout << alias << 3.16464;

参见 operator<< 的重载 (9) :

basic_ostream& operator<<(std::ios_base& (*func)(std::ios_base&))

如果你想指定参数,你需要一个中间结构:

struct alias_t {
    int n;
};

alias_t setalias(int n) { return {n}; }

template <class CharT, class Traits>
std::basic_ostream<CharT, Traits>& 
operator<<(std::basic_ostream<CharT, Traits>& out, const alias_t& alias) {
    return out << std::fixed << std::setprecision(alias.n);
}

// Or if you do not care about genericity:
std::ostream& operator<<(std::ostream& out, const alias_t& alias) {
    return out << std::fixed << std::setprecision(alias.n);
}

然后:

std::cout << setalias(6) << 3.16464;

关于c++ - 如何为多个流操作创建别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39833607/

相关文章:

c++ - g++ 标志只检查语法?

c - 替换运算符 new 和删除似乎会影响 C 库

c++ - 检查模板类型是否在可用类型列表中

c++ - std::cout 在具有静态存储持续时间的对象的构造函数中的使用

c++ - C block 扩展 (libBlocksRuntime) - 为 Block_copy() 使用自定义内存分配器 (Boehm GC)

c++ - 为什么我的 DirectInput8 堆栈会溢出?

c++ - 如何在非网关接口(interface) linux 上检测互联网连接

c++ - 从基类转换为未知的派生类

c++ - boost::subgraph 中的顶点问题

c++ - 存储成员函数模板实例时出错