2010-05-30 2 views
1

У меня есть шаблонный классC++ Design Вопрос о типах шаблонов

template <typename T> 
    class MyContainerClass 

Для типов, чтобы быть заменен на Т, он должен удовлетворять многие требования: например, get_id(), внутр данные(), и т.д.

Очевидно, что ни один из основных типов (POD) не подлежит замене. В одном из способов я могу предоставить это через обертки для POD, которые предоставляют эти функции. Это приемлемый способ ?

Другой способ изменить шаблон:

template < typename T, typename C=traits<T> > 
class MyContainerClass 

и внутри MyContainerClass, вызовите черты :: данные() вместо данных() на объектах Т. Специализируется traits<int>, traits<const char *> и т.д.

Это хороший дизайн? Как создать такой класс признаков (полностью статические методы или разрешить для наследования)? Или класс-оболочка - хорошее решение?

Какие еще альтернативы?

ответ

3

Другим способом решения этой проблемы было бы специализировать шаблон для конкретных типов, например.

template <> 
    class MyContainerClass<int> 

И затем, очевидно, реализуйте все необходимое для использования контейнера с ints.

Но я считаю, что черты-решения намного лучше. Это также позволит вам повторно использовать черты в других контейнерах и других классах, которые вы делаете позже.

0

Вы увидите, что std довольно широко использует type_traits. Вы можете проверить, действительно ли они отвечают вашим потребностям, но также, это должно быть хорошим советом для вас, что спецификация структуры признаков - это правильный путь.

0

Несмотря на то, что все остальные предпочитают специализацию, я бы пошел с чертами. Там две причины:

  1. Они «используют специализацию» -idea в маскировке, так как они используют специализацию, тоже, но их идея состоит в том, чтобы экстернализовать специализаций, так что они выиграли» t загрязняют ваши фактические алгоритмы.

  2. Используется в стандартной библиотеке, это хорошо зарекомендовавшая себя и хорошо известная техника, которую каждый сразу узнает. Напротив, специализации не используются так много в std lib. (Я только слышал, как кто-то кричал std::vector<bool>?).

0

Я бы тоже любил черты, по другой причине. Используя SFINAE, вы можете получить рабочий is_class предиката:

template <typename T> 
struct traits 
{ 
    static const bool is_class = sizeof(test<T>(0)) == 1; 

private: 
    template <typename U> char (&test(int U::*))[1]; 
    template <typename> char (&test(...))[2]; 
}; 

и специализируетесь на типах неклассовых без необходимости перечислять все основные типы (которая нуждается в определенной дозе макросов, которые будут сделаны ремонтопригодны ...)