Giả sử tôi muốn viết hàm chung void f<T>()
, có một điều nếu T
là loại POD và một điều khác nếu T
không phải là POD (hoặc bất kỳ biến vị ngữ tùy ý nào khác).Công văn thẻ so với phương pháp tĩnh trên các lớp chuyên ngành một phần
Một cách để đạt được điều này sẽ được sử dụng một mô hình thẻ-văn như thư viện tiêu chuẩn nào với loại iterator:
template <bool> struct podness {};
typedef podness<true> pod_tag;
typedef podness<false> non_pod_tag;
template <typename T> void f2(T, pod_tag) { /* POD */ }
template <typename T> void f2(T, non_pod_tag) { /* non-POD */ }
template <typename T>
void f(T x)
{
// Dispatch to f2 based on tag.
f2(x, podness<std::is_pod<T>::value>());
}
Một thay thế sẽ được sử dụng chức năng thành viên tĩnh của các loại phần chuyên ngành:
template <typename T, bool> struct f2;
template <typename T>
struct f2<T, true> { static void f(T) { /* POD */ } };
template <typename T>
struct f2<T, false> { static void f(T) { /* non-POD */ } };
template <typename T>
void f(T x)
{
// Select the correct partially specialised type.
f2<T, std::is_pod<T>::value>::f(x);
}
Ưu điểm và nhược điểm của việc sử dụng một phương pháp so với phương pháp khác là gì? Bạn sẽ giới thiệu cái nào?
Bất cứ điều gì làm nổi thuyền của bạn. Tôi tìm thấy phiên bản thứ hai "typetraity" và hấp dẫn, bởi vì có ít mã phụ trợ hơn và ít khái niệm ẩn hơn. Ngoài ra tôi muốn thêm chuyển tiếp cho các đối số! –