C++的封装(七):namespace

C++很多类型在定义的时候,同时也定义了一些标志,供用户调用的时候使用。典型的,如STL的iostream,打开文件时,就需要用到一些预定义的标志。

#include <fstream>
using namespace std;

int main()
{
	ofstream fp("test.txt", ios::out|ios::app|ios::ate);
}

这样,既显得臃肿记忆又有些负担:用到的out,ate,app标志究竟属于ios? ios_base? basic_ios? 还是别的某个类? 用的时候需要费点脑子想一想。

这时可以把所用到名字输出到自定义的namespace中, 如:

#include <stdio.h>
class X {
public:
	enum {Zero, One, Two};
};

namespace ns {
	enum {Zero=X::Zero, 
		One =X::One,
		Two = X::Two
	};
}

using namespace ns;

int main()
{
	printf("%d\n", One);
}

这样使用时就不需要带上讨厌的类名作前缀了。

不幸的是,对于fstream的这个例子,仅仅这样做还是不够。这是因为在iostream库中,对_Ios_Openmode这个枚举类型重载了位运算符,而fstream中的open()函数flag也强调为_Ios_Openmode而不是普通的int类型。这就需要一点额外的技巧:

#include <stdio.h>
#include <fstream>
using namespace std;

namespace ns{
        enum open_flag {
        out = ios::out,
        ate = ios::ate,
        app = ios::app
        };
        typeof(ios::out) openflag=ios::out^ios::out;

        inline typeof(openflag) operator|(typeof(openflag)f, int tail)
        { return f|(typeof(openflag))tail; }
}

using namespace ns;
int main()
{
        ofstream fp("test.txt", openflag|out|ate|app);
}

这样就不再需要带上类分辨符了。是的,C++提供了足够的机制,所以没有必要强迫自己做任何事情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值