Является ли эта реализация контейнера полностью разумной? - PullRequest
0 голосов
/ 23 ноября 2010

Не могли бы вы написать следующий простой контейнер каким-либо другим способом или он совершенно разумен как есть:

template <typename T, bool small_>
struct TransType
{
   typedef const T& param_type;
};

template <typename T>
struct TransType<T, true>
{
   typedef const T param_type;
};

template <class T>
class Container:public TransType<T,sizeof(T)<=sizeof(void*)> {
 public:
  param_type getVal(){
   return obj;
  }
  void setVal(param_type input){
   containment=input;
  }
 private:
  T containment;
};

Ответы [ 3 ]

1 голос
/ 23 ноября 2010

Просмотр Boost.CallTraits .А именно, boost::call_traits<T>::param_type.

Вам не нужно, чтобы клиент указывал, является ли тип маленьким или нет, это задача метафункции.Также нет необходимости наследовать от чего-либо.

На самом деле ваш код сейчас плохо сформирован .Поскольку param_type не является зависимым типом, поиск выполняется без учета базового класса;и не будет найден.Вам нужно либо явно указать его с помощью базового класса, либо добавить директиву using, либо повторно ввести его по умолчанию.

Вы просто хотите получить следующее::

namespace detail
{
    template <typename T, bool small_>
    struct TransType
    {
       typedef const T& param_type;
    };

    template <typename T>
    struct TransType<T, true>
    {
       typedef const T param_type;
    };
}

template <typename T>
struct TransType<T>
{
   typedef detail::TransType<T, sizeof(T)<=sizeof(void*)> param_type;
};

Теперь условие является автоматическим, и нет проблем с базовым классом.

1 голос
/ 23 ноября 2010

Я бы не унаследовал от метафункции.

0 голосов
/ 23 ноября 2010

Помимо комментария GMan о необходимости явного деструктора в той или иной форме, добавляет ли вам дополнительная сложность значительную производительность? Стандартная библиотека, казалось, думала, что пользователь должен хранить в контейнере соответствующий тип, так что копирование в некоторых случаях не является узким местом.

...