Шаблонные классы в союзе? - PullRequest
       1

Шаблонные классы в союзе?

2 голосов
/ 24 октября 2010

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

union TestUnion
{
 template<typename T> class MyClass
 {
 public:
  MyClass() { };
  MyClass(T& t) : _t(t) { }

 private:
  T _t;
 };
};

Но sizeof(TestUnion) всегда равно 1, но, например, sizeof(MyClass<int>) правильно возвращает 4. У кого-нибудь есть идеи получше?

Ответы [ 3 ]

2 голосов
/ 24 октября 2010

Не существует такого понятия, как максимальный размер класса шаблона, особенно если этот класс содержит экземпляр аргумента шаблона, как ваш. Рассмотрим каждый из

  template <typename T> class MyClass {
    public:
      MyClass() { };
      MyClass(T& t) : _t(t) { }

    private:
      T _t;
  };

  union TestUnion {
    MyClass<char>;
    MyClass<unsigned char>;
    MyClass<signed char>;
    MyClass<short>;
    // ...
    MyClass<float>;
    MyClass<double>;
    MyClass<char*>;
    MyClass<int*>;
    // ...
    MyClass<void*>;
    MyClass<void (*)(void)>;
    MyClass<std::vector>;
    // ...
    MyClass<int[10]>;
    MyClass<int[100]>;
    MyClass<int[1000]>;
    MyClass<int[10000]>;
    MyClass<int[100000]>;
  };

и так далее ... Или, что не менее увлекательно, вставить

    MyClass< MyClass< MyClass< ... < XImage > ... > > >

(по общему признанию, не гарантируется, что он будет работать больше, чем обещанная максимальная глубина создания вложенного шаблона (сейчас 17, скоро 1024)).

Итак, очевидно, что теоретического максимума нет. Если вы имеете в виду вселенную типов, которая фактически будет параметрами шаблона для MyClass <>, то это может быть выполнимо.

EDIT - заменено <на <code>&lt;, чтобы аргумент шаблона не был скрыт парсером SO.

1 голос
/ 24 октября 2010

Вы получаете размер профсоюза, в котором нет членов.Объявление шаблона в области действия объединения не объявляет членов объединения.В C ++ (а также, я полагаю, в C) гарантируется, что все типы классов или объединений занимают как минимум 1 байт пространства.Вот почему размер равен 1.

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

0 голосов
/ 24 октября 2010

Я не эксперт, когда дело доходит до определения размеров классов C ++ ... Я уверен, что есть лучший способ. Предполагая, что вам нужен только потенциальный максимальный размер для всех экземпляров, которые вы планируете использовать, вот вероятный хакерский способ:

const foo = (sizeof (MyClass)> sizeof (MyClass)? (Sizeof (MyClass): sizeof (MyClass)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...