例如,最初我有一个示例程序:
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int a[3];
sort(begin(a),end(a));
cin;
}
现在我想修改std::cin
(以提供更多函数,例如在输入失败时调用函数)。所以我引入了一个标题mystd.h
,如:
#include<iostream>
#include<algorithm>
//begin of mystd.h
namespace mystd {
struct cin_wrapper {
}cin;
}
//end of mystd.h
using namespace std;
int main() {
int a[3];
sort(begin(a),end(a));
mystd::cin;
}
但这种变化似乎不方便。(用户必须提及所有组件using std::sort;using mystd::cin;
或将所有cin
替换为mystd::cin
。using namespace std;using mystd::cin;
会导致cin
暧昧)
事实上,我将编写一个经过修改的标准库,并使其像原始库一样方便。我希望用户可以编写的理想代码是:
(PS:这意味着mystd
可以仅用作std
,并不表示我希望鼓励用户在任何地方使用using namespace
#include<iostream>
#include<algorithm>
#include "mystd.h"
using namespace mystd;
int main() {
int a[3];
sort(begin(a),end(a));//std::sort
cin;//mystd::cin
}
//or
int main() {
int a[3];
mystd::sort(mystd::begin(a),mystd::end(a));//sort, begin, end from std
mystd::cin;
}
我已尝试在using namespace std;
中添加mystd
,但这也会导致含糊不清。
我可以成像的一个复杂解决方案是在using std::string;
中为所有未修改的std成员创建类似mystd
的使用语句。
我是否有更实际的方式来实施mystd.h
?
答案 0 :(得分:1)
如果您真的坚持这样做,可以通过在嵌套范围内引入using
语句来实现这一目的。例如:
using namespace std;
int main() {
using namespace mystd;
int a[3];
sort(begin(a), end(a));//std::sort
cin_wrapper w;//mystd::cin
}
应该避免涉及using namespace std;
的任何事情(使用其他更受限制的命名空间并不是那么糟糕,但是那个是你正在打开的大量卡车。)
答案 1 :(得分:0)
这不是一个好主意,因为它非常脆弱。
想象一下有人写了你的“理想”代码。然后,有一天,你编写mystd::sort
接受一个Range而不是两个迭代器。
突然,现有代码的含义意外地发生了变化,并且开始无法编译,因为它没有预料到参数的数量现在应该是1而不是2。
答案 2 :(得分:0)
您的要求是由“命名空间”的发明无缝实现的。
如果“productB”是您的产品,其名称与“productA”中的名称相同,则需要重写;然后您可以通过界面文件“productB.h”中的某些“using”语句决定用户使用哪些名称。 “。
源文件productA.h:
namespace productA
{
void f1();
void f2();
}
你的源文件productB.h:在这里你决定使用什么:
namespace productB
{
void f1();
void f2();
}
using productA::f1;
using productB::f2;
实现:
#include <iostream> // std::cout
#include "productA.h"
#include "productB.h"
void productA::f1() { std::cout << "called A::f1" <<std::endl; }
void productA::f2() { std::cout << "called A::f2" <<std::endl; }
void productB::f1() { std::cout << "called B::f1" <<std::endl; }
void productB::f2() { std::cout << "called B::f2" <<std::endl; }
申请:非常方便
#include "productA.h"
#include "productB.h"
int main () {
f1();
f2();
}
输出:
called A::f1
called B::f2
注意:没有什么是暧昧的