2009-12-08 54 views
7

Đọc một số mã nguồn, tôi đã tìm thấy những đặc điểm tiếp theo định nghĩa:Định nghĩa kiểu đặc điểm. Đặc điểm blobs & Metafunctions

namespace dds { 
    template <typename Topic> struct topic_type_support { }; 
    template <typename Topic> struct topic_data_writer { }; 
    template <typename Topic> struct topic_data_reader { }; 
    template <typename Topic> struct topic_data_seq { }; 
} 

#define REGISTER_TOPIC_TRAITS(TOPIC) \ 
namespace dds { \ 
    template<> struct topic_type_support<TOPIC> { \ 
     typedef TOPIC##TypeSupport type; }; \ 
    template<> struct topic_data_writer<TOPIC> { \ 
     typedef TOPIC##DataWriter type; }; \ 
    template<> struct topic_data_reader<TOPIC> { \ 
     typedef TOPIC##DataReader type; }; \ 
    template<> struct topic_data_seq<TOPIC> { \ 
     typedef TOPIC##Seq type; }; \ 
} 

Điều đó có vẻ lạ với tôi. Tôi đã có thể nhóm lại tất cả các đặc điểm trong một lớp học độc đáo như thế này:

namespace dds { 
    template <typename Topic> struct topic_traits { }; 
} 

#define REGISTER_TOPIC_TRAITS(TOPIC) \ 
namespace dds { \ 
    template<> struct topic_traits<TOPIC> { \ 
     typedef TOPIC##TypeSupport type_support; \ 
     typedef TOPIC##DataWriter data_writter; \ 
     typedef TOPIC##DataReader data_reader; \ 
     typedef TOPIC##Seq seq_type; \ 
    }; \ 
} 

bất kỳ của bạn có thể hiểu tại sao tiếp cận thứ hai có thể yếu hơn so với cái đầu tiên hoặc đáng kể khó khăn hơn để thêm những đặc điểm mới?

Trả lời

5

Có một lớp mẫu đơn bây giờ được gọi là "đặc điểm blob". "Các đặc điểm blob" không được khuyến khích vì chúng không hoạt động tốt với hàm meta (tức là các hàm biên dịch-thời gian).

Siêu chức năng là mẫu lấy một lớp và thực hiện một số thao tác trên lớp. Một cái gì đó như:

template <class T> 
class metafunction 
{ 
    typename T::type value = ...; 
} 

Sau đó, bạn có thể gọi hàm meta cho bất kỳ đặc điểm của bạn bằng cách thực hiện:

metafunction<topic_type_support<int> >::value; 
metafunction<topic_data_writer<int> >::value; 

Bạn sẽ không thể gọi là meta-chức năng với lớp đặc điểm blob của bạn bởi vì có bây giờ là cách để nói cho các metafunction mà typedef sử dụng.

Nếu bạn muốn tìm hiểu thêm về hàm meta, tôi khuyên bạn nên đọc sách C++ Template Metaprogramming.

+0

Để biết thêm về lập trình meta google Boost MPL – KitsuneYMG

+0

@Samuel: Đặc điểm blob. Đó là tên tôi đang tìm kiếm! Cảm ơn. Tôi đã ra lệnh cho sách Abraham. –

1

Đó là vấn đề về phong cách. Ví dụ của bạn có thể dễ bảo trì hơn, nhưng có các loại riêng biệt mang lại lợi thế là chúng độc lập - bạn có thể dễ dàng chuyên, ví dụ: topic_data_reader cho tất cả các loại con trỏ, nhưng để các loại khác không được chuyên môn hóa.

Nếu bạn muốn đi sâu hơn, tôi muốn đặt câu hỏi về sự thiếu giá trị mặc định:

namespace dds { 
    template <typename Topic> struct topic_traits { 
    typedef typename Topic::type_support type_support; 
    typedef typename Topic::data_writer data_writer; 
    typedef typename Topic::data_reader data_reader; 
    typedef typename Topic::seq_type seq_type; 
    }; 
} 

Cách tiếp cận này có nghĩa là bất kỳ lớp cung cấp các điều kiện tiên quyết typedefs tự động đủ điều kiện. Một macro vẫn có thể được sử dụng để tạo ra các typedef hoặc chuyên lớp đó, nhưng điều đó có lẽ không cần thiết (seq_type đặc biệt trông đáng ngờ như nó thường là typedef, không phải kiểu người dùng định nghĩa). EDIT: Với một đặc điểm lớn hơn, bạn có thể sử dụng để tách số lượng yêu cầu, nhưng nếu lớp đặc điểm của bạn có các yếu tố trong đó sử dụng một yếu tố có nghĩa là bạn đang sử dụng các yếu tố khác, điều này không có lợi.

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