C ++ Design Вопрос о типах шаблонов - PullRequest
1 голос
/ 31 мая 2010

У меня есть шаблонный класс

  template <typename T>
    class MyContainerClass

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

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

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

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

и внутри MyContainerClass вызывать traits :: data () вместо data () для объектов T.Я буду специализироваться traits<int>, traits<const char *> и т. Д.

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

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

Ответы [ 4 ]

3 голосов
/ 31 мая 2010

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

.
template <>
    class MyContainerClass<int>

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

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

0 голосов
/ 23 июня 2010

Я бы тоже предпочел черты по другой причине. Используя 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];
};

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

0 голосов
/ 31 мая 2010

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

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

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

0 голосов
/ 31 мая 2010

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

...