是否可以使用命名空间重用变量名称?

时间:2016-06-22 04:00:34

标签: c++ c++11

例如,最初我有一个示例程序:

#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::cinusing 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

3 个答案:

答案 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

注意:没有什么是暧昧的