Nếu bạn thực sự muốn loại bỏ bản mẫu và bạn sẵn sàng sử dụng bộ tiền xử lý để làm điều đó, thì hãy tiếp tục và viết lên mẫu. Các mô hình chung bạn đã trông như thế
extern "C" {
void C_accessible_declaration(); // this is all C sees
}
void Cxx_accessible_declaration_1(int);
void Cxx_accessible_declaration_1(long);
Vì vậy, bạn có thể làm cho một macro,
#ifdef __cplusplus
# define C_PORTABLE_FUNCTION_SET(C_DECLS, CXX_DECLS) \
extern "C" { C_DECLS } \
CXX_DECLS
#else
# define C_PORTABLE_FUNCTION_SET(C_DECLS, CXX_DECLS) \
C_DECLS
#endif
này hoạt động vì một tuyên bố chức năng bình thường không thể chứa dấu phẩy không được bao bọc bởi dấu ngoặc đơn. Nếu bạn muốn nó làm việc với các khuôn mẫu (với các tham số mẫu được phân tách bằng dấu phẩy), thì bạn có thể các macro variadic, được hỗ trợ trong C99, C++ 11 và các trình biên dịch khác nhau trước các tiêu chuẩn đó làm phần mở rộng.
#ifdef __cplusplus
# define C_PORTABLE_FUNCTION_SET(C_DECLS, ...) \
extern "C" { C_DECLS } \
__VA_ARGS__
#else
# define C_PORTABLE_FUNCTION_SET(C_DECLS, ...) \
C_DECLS
#endif
Bây giờ điều này hoạt động miễn là các khai báo C không chứa dấu phẩy thường, có nghĩa là bạn không nên khai báo nhiều đối tượng trong một khai báo. Tôi đã gọi nó là C_PORTABLE_FUNCTION_SET
để nhấn mạnh nó chủ yếu an toàn để sử dụng với các khai báo hàm, nhưng lưu ý rằng bạn cần khai báo các đối tượng C-access trong phạm vi extern C
. Các định nghĩa được chia sẻ struct
không được bảo vệ chút nào; chúng được bảo vệ bởi khái niệm C++ POD, và không mang liên kết ngôn ngữ.
Cách sử dụng:
#ifdef __cplusplus
template< typename T, typename U >
class Buffer { // still use #ifdef for the general case
...
};
#endif
C_PORTABLE_FUNCTION_SET (
void ArrayList_insert(ArrayList *arrlst, void *data, int i);
, /* C++ */
void ArrayList_insert(ArrayList *arrlst, char *data, int i);
template< typename T, typename U >
void ArrayList_insert(ArrayList *arrlst, Buffer< T, U > &data, int i);
)
Tôi không nghĩ rằng tôi muốn làm điều này bản thân mình, nhưng có vẻ như đủ an toàn để trở thành thành ngữ.
điều này sẽ gây ra lỗi khi biên dịch với c vì c không hỗ trợ chức năng nạp chồng quá tải. – chacham15
chacham15 - bạn nói đúng. Tôi đã sửa câu trả lời, vì tôi đã đọc sai câu hỏi. –
Bây giờ nó tương đương với câu trả lời của @Carl Norum. – chacham15