2012-09-26 32 views
5

Đó nên là tầm thường để thực hiện, một cái gì đó giống nhưCó chức năng std nào chỉ trả về tham số của nó không?

template<typename T> 
T & as_is(T & t) { return t; } 

Tuy nhiên, tôi muốn không phải viết nó (:

tôi không tìm thấy một điều như vậy trên www.cplusplus.com

. Đối với những người sẽ hỏi "những gì bạn đang cố gắng để làm", đây là điều.Tôi có một lớp học mà xây dựng các bảng ascii, với padding tốt đẹp và tất cả mọi thứ.Tôi sẽ phụ tùng các chi tiết.Điều quan trọng là nó lưu trữ dây (do đó, nó có thể tính toán bao nhiêu để pad) .Tôi muốn thực hiện một chức năng sắp xếp và có thể nói cho lớp t o sử dụng cột như một loại nhất định. Nếu tôi muốn sắp xếp theo một cột ints (trong đó, một lần nữa, là chuỗi nội bộ), tôi sẽ vượt qua atoi. Nếu sắp xếp chuỗi, tôi muốn vượt qua as_is hoặc tương đương stl, nếu có.

+4

Có thể 'std :: forward ' đáp ứng các yêu cầu đó? –

+1

@Kerrek: Đó là một điều tốt, mặc dù nó yêu cầu bạn đánh vần các đối số mẫu. – Xeo

Trả lời

2

Bạn không thể chuyển mẫu như thể nó là một hàm, do đó, không phải lệnh std :: forward cũng như nonstd :: identity của bạn sẽ hoạt động như cũ (như cũ). Bạn sẽ cần phải thiết lập một cách rõ ràng các loại mục tiêu của transform:

table.SortColumnUsing(3, nonstd::identity<std::string>); 

Đó có vẻ hơi xấu xí với tôi, bởi vì loại trong mẫu chuyên môn hóa là một tính năng của việc thực hiện nội bộ của bảng, thay vì phải bất cứ điều gì để làm với loại tôi mong đợi bảng để tuần tự hóa cho các mục đích phân loại. Hoặc có lẽ bạn không thực sự lưu trữ các cột như std :: string.

Làm thế nào để atoi hoạt động như một bộ mô tả kiểu? atoi mong đợi một char *, không phải là một std :: string, và tôi không nghĩ rằng bạn hoàn toàn có thể chuyển đổi int(const char*) thành int(const std::string&). Ngay cả khi bạn có thể làm điều đó, bạn sử dụng loại nào có thể lưu trữ cả một số int(const std::string&) và một số Banana(const std string&). Có lẽ tôi không hoàn toàn hiểu được bối cảnh của câu hỏi của bạn, hoặc cách khác bạn có một số thủ thuật C++ lên tay áo của bạn mà tôi rất muốn tìm hiểu.

Độ nghiêng của tôi sẽ vượt qua hàm so sánh thay vì chức năng chuyển đổi. Điều đó sẽ dẫn đến một loại hàm hằng số duy nhất, có thể là bool(const std::string&, const std::string&). Điều đó cũng có thể làm cho nó đơn giản hơn để thực hiện ví dụ. so sánh chuỗi không phân biệt chữ hoa hoặc chữ thường cho các cột cụ thể hoặc các cách sắp xếp phân loại thuận tiện khác của giao diện người dùng (như đặt thư mục ở đầu danh sách: trước tiên hãy kiểm tra xem chỉ một chuỗi có dấu móc /, hoặc sử dụng so sánh chuẩn). Điều đó không thực sự giải quyết vấn đề chuyên môn, mặc dù; đối với trường hợp std::string, bạn vẫn kết thúc với std::less<std::string> (ít nhất là tồn tại.)

Không phải câu trả lời hay, tôi biết ... nhưng quá dài để nhận xét.

+1

Đây là một câu trả lời hay, vì nó đi theo nguyên nhân, không phải vấn đề. Việc chuyển một hàm chuyển đổi để sắp xếp theo "thứ tự tích phân" có vẻ xấu như vậy, vì vậy +1 trên gợi ý một hàm so sánh. – Xeo

+0

Tôi thực sự đang chuyển một hàm so sánh sang hàm sắp xếp hiện tại. Tôi muốn (ed) để loại bỏ nó vì sự rầm rộ của cấu trúc. Điều đó nói rằng, tôi đã quên rằng tôi vẫn phải '.c_str()' các chuỗi trong 'atoi' của functor, điều này sẽ ngăn cản nó chuyển sang chức năng sắp xếp, do đó phá vỡ ví dụ. – Gabriel

3

Tại sao không quá tải chức năng và không vượt qua bất cứ điều gì?

Btw, nếu bạn đang làm việc với MSVC, họ có mẫu lớp học identity, có quá tải operator() trả về đầu vào. Vì vậy, về mặt lý thuyết, bạn có thể vượt qua std::identity<std::string>(), nhưng tôi muốn nói, chỉ cần tạo hàm identity của riêng bạn.

+0

Thú vị. Có vẻ như danh tính không phải là MS cụ thể: http://www.sgi.com/tech/stl/identity.html http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-api-4.5/a00497.html – Gabriel

+0

Quá tải có nghĩa là sao chép một số mã.Để tránh trùng lặp, quá tải mà không cần tham số sẽ gọi phiên bản với param, cho nhận dạng. Điều này sẽ cung cấp các phương thức tiện lợi, thêm tính phức tạp trong khi không thêm bất kỳ tính năng nào. – Gabriel

+2

@Gabriel nó nằm trong bản nháp cũ của tiêu chuẩn mới nhất nhưng đã bị loại bỏ. Bạn sẽ không tìm thấy nó trên GCC 4.6. –

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