của thư viện C++ của tôi Tôi đang phát triển thư viện C++, nơi người dùng sẽ cung cấp các đầu vào phức tạp, chẳng hạn như ma trận và quaternions . Tôi không muốn phải triển khai lại các loại này, vì vậy, nội bộ, tôi sẽ sử dụng thư viện Eigen.Các loại bên thứ ba sẽ được hiển thị trong API
Tôi đang cố gắng quyết định cách tốt nhất để hiển thị các loại này cho các khách hàng của thư viện của tôi và đã đưa ra một vài tùy chọn cho API của tôi. Tôi sử dụng một loại quaternion làm ví dụ, nhưng điều này có thể áp dụng như nhau đối với ma trận và như vậy. Ngoài ra, mặc dù tôi đang nói cụ thể về việc phơi bày các loại của Eigen, tôi đoán câu hỏi này có thể áp dụng tốt cho các thư viện bên ngoài khác đang được sử dụng.
1) Sử dụng C++ loại chỉ cơ bản
Tùy chọn này sẽ yêu cầu khách hàng để truyền dữ liệu trong thông qua loại hình cơ bản. Đối với Ví dụ, để thông qua trong một quaternion (4 yếu tố), người ta có thể làm:
void my_func(double my_quat[4])
2) Đưa ra các loại Eigen của
Eigen cung cấp một số loại templated cho mảng và quaternions. Đối với Ví dụ, nếu một chức năng đòi hỏi một quaternion, tôi có thể sử dụng Eigen của Quaterniond
loại (mà thực sự là một typedef cho Quaternion<double>
):
void my_func(const Eigen::Quaterniond& my_quat)
3) Tạo một wrapper đơn giản cho các loại khác nhau cho khách hàng
tôi có thể tạo ra một loại rất đơn giản quaternion (nói, một số loại cấu trúc đơn giản) mà khách hàng sẽ phải tạo (có lẽ qua một số loại chức năng nhà máy) để chuyền qua API của tôi:
void my_func(const quaternion_t& my_quat)
Thư viện của tôi sẽ chuyển đổi loại quaternion_t
thành biểu diễn Eigen nội bộ của tôi.
Tôi không thích tùy chọn 1 quá nhiều vì tôi muốn có ý nghĩa mạnh mẽ hơn về việc nhập vào API của tôi. Tùy chọn 2 cũng sẽ yêu cầu khách hàng của tôi sử dụng Eigen, chứ không phải để đề cập đến các vấn đề tiềm năng với khả năng tương thích nếu họ sử dụng phiên bản khác nhau của Eigen (Eally là thư viện chỉ tiêu đề nếu số vấn đề). Tùy chọn rời khỏi tùy chọn 3.
Mọi người nghĩ sao? Tôi đã trả lời câu hỏi của riêng mình chưa? Có ví dụ nào không?
Câu hỏi liên quan
Một câu hỏi liên quan được hỏi here nhưng không thực sự đi sâu vào chi tiết về việc liệu một nên lộ loại bên ngoài.
Còn tùy chọn 3, với các nhà thầu chọn cả hai lựa chọn 1 và 2 thì sao? Ngữ nghĩa C++ cho phép bạn chuyển tiếp các kiểu khai báo đủ tốt để làm việc này (các máy khách không có Eigen vẫn có thể bao gồm tiêu đề và không thất bại trong thời gian biên dịch). – Lalaland
Tôi đã suy nghĩ về một cái gì đó như thế, nhưng tôi đoán tôi là một chút mờ về làm thế nào để chuyển tiếp khai báo kiểu typedef'd mẫu, mặc dù tôi đoán trong trường hợp của tôi, tôi có lẽ sẽ giới hạn khách hàng để đi qua một instantiation cụ thể của các loại (như 'Quaternion' trái với 'Quaternion '). –
plasma
Tôi cũng hơi mờ về những gì sẽ xảy ra nếu một khách hàng sử dụng hàm tạo để tạo kiểu thư viện của tôi từ kiểu Eigen của họ, nhưng họ đang sử dụng một phiên bản khác của Eigen có thể có một thay đổi nhỏ. – plasma