2016-06-22 20 views
7

Ví dụ, ban đầu tôi có một chương trình mẫu:Có thể sử dụng lại tên biến có sử dụng không gian tên không?

#include<iostream> 
#include<algorithm> 
using namespace std; 
int main() { 
    int a[3]; 
    sort(begin(a),end(a)); 
    cin; 
} 

Bây giờ tôi muốn thay đổi std::cin (để cung cấp thêm các chức năng như gọi một chức năng khi đầu vào thất bại). Vì vậy, tôi giới thiệu một tiêu đề mystd.h như:.

#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; 
} 

Nhưng sự thay đổi có vẻ là không thuận tiện (. Người sử dụng phải đề cập đến tất cả các thành phần using std::sort;using mystd::cin; hoặc thay thế tất cả cin với mystd::cinusing namespace std;using mystd::cin; làm cho cin mơ hồ)

Trong thực tế Tôi sẽ viết một thư viện chuẩn đã sửa đổi và sử dụng nó một cách thuận tiện như bản gốc. Mã lý tưởng tôi muốn người dùng có thể viết là:

(PS: điều này có nghĩa mystd có thể chỉ được sử dụng như std, không chỉ tôi muốn khuyến khích người dùng sử dụng ở khắp mọi nơi 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; 
} 

Tôi đã thử để thêm using namespace std; vào mystd nhưng cũng gây ra sự mơ hồ.

Một giải pháp phức tạp mà tôi có thể tạo hình là tạo câu lệnh sử dụng như using std::string; trong mystd cho tất cả thành viên không được sửa đổi.

Có cách nào thực tế hơn để tôi triển khai mystd.h không?

+1

Tôi đề nghị bên trong 'mystd.h' bạn không có bất kỳ câu lệnh' using std :: ', và tiền tố một cách rõ ràng tiền tố không phải' mystd' với 'std ::' - bất kỳ điều gì khác có vẻ hỗn loạn và dễ bị lỗi. –

+8

Viết mã khuyến khích hoặc thậm chí tệ nhất * mong đợi * việc sử dụng rộng rãi của 'sử dụng không gian tên X' là một ý tưởng tồi. –

+0

Tôi không muốn khuyến khích sử dụng 'sử dụng không gian tên', chỉ muốn cung cấp các tập quán giống với' std'. Không gian tên trong tiêu đề có liên quan đến việc nhập các thành viên 'std' vào' mystd'. Xin lỗi vì đã không thể hiện rõ ràng lúc đầu. – James

Trả lời

1

Nếu bạn thực sự nhấn mạnh vào việc này, bạn có thể quản lý để thực hiện việc này bằng cách giới thiệu các câu lệnh using của bạn tại phạm vi lồng nhau. Ví dụ:

using namespace std; 

int main() { 
    using namespace mystd; 

    int a[3]; 
    sort(begin(a), end(a));//std::sort 
    cin_wrapper w;//mystd::cin 
} 

Bất cứ điều gì liên quan đến using namespace std; nên tránh mặc dù (sử dụng khác, không gian tên hạn chế hơn không phải là quá xấu, nhưng đó là một trong một xe tải khổng lồ lon worms bạn đang mở).

+0

Có vẻ như 'sử dụng không gian tên' trong các phạm vi khác nhau không thể cho phép tôi sử dụng lại tên biến' cin', điều đó có nghĩa là sẽ cần thay đổi nhiều hơn nếu chuyển từ 'std' sang' mystd'. – James

0

Đây không phải là ý tưởng hay vì nó rất mong manh.

Hãy tưởng tượng rằng ai đó viết mã "lý tưởng" của bạn. Sau đó, một ngày, bạn viết mystd::sort chấp nhận một Phạm vi thay vì hai vòng lặp.

Đột nhiên ý nghĩa của mã hiện tại đã thay đổi bất ngờ và bắt đầu không biên dịch được vì không dự đoán được số tham số bây giờ là một thay vì hai.

+0

Sửa đổi của tôi sẽ không thay đổi chức năng hoặc giao diện hiện tại của các chức năng. Nó sẽ chỉ ảnh hưởng đến một số kiểm tra tham số, các bước trung gian hoặc cách xử lý lỗi. – James

0

Yêu cầu của bạn được thực hiện một cách seamles bằng cách phát minh "không gian tên".

Nếu "productB" là sản phẩm của bạn có cùng tên như trong "productA, bạn muốn viết lại; sau đó bạn quyết định tên nào sẽ được người dùng sử dụng qua một số câu" sử dụng "trong tệp giao diện" productB. h"

nguồn tập tin productA.h:.

namespace productA 
{ 
    void f1(); 
    void f2(); 
} 

bạn productB tập tin nguồn.h: ở đây bạn quyết định, những gì để sử dụng:

namespace productB 
{ 
    void f1(); 
    void f2(); 
} 
using productA::f1; 
using productB::f2; 

thực hiện:

#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; } 

ứng dụng: rất thuận tiện

#include "productA.h" 
#include "productB.h" 
int main() { 
    f1(); 
    f2(); 
} 

đầu ra:

called A::f1 
called B::f2 

thông báo: không có gì là ambigous

+0

Tôi cảm thấy như bạn đọc tiêu đề, nhưng không phải là văn bản, của câu hỏi. – davmac

Các vấn đề liên quan