Как «переименовать» создание экземпляра шаблона без использования наследования?

Предположим, вы используете шаблонный класс в своем приложении, например, например. std :: tuple (или std :: shared_ptr, или как угодно), и у вас есть такие экземпляры:

typedef std::tuple<Book,Library> BookLibrary;
typedef std::tuple<Book,Chapter,Reader> BookChapterReader;

И затем вы используете эти экземпляры в других шаблонных классах, например, std :: map как член в классе:

class X
{
...
private:
std::map<Library,BookChapterReader> m_data;
};

Затем полученный файл PDB будет содержать описания, подобные этому (это можно увидеть с помощью утилиты DBH Microsoft Debugging Tools):

std::_Tree<std::_Tmap_traits<Library,std::tr1::tuple<Book,Chapter,Reader,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>,std::less<Library>,std::allocator<std::pair<Library const ,std::tr1::tuple<Book,Chapter,Reader,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil> > >,0> >

Если у вас есть некоторые из этих конструкций, то файл PDB растет очень быстро, до момента, когда компоновщик просто отказывается связывать ваше приложение (очевидно, файл PDB имеет ограничение в 1 ГБ).

Решением может быть создание подкласса шаблонного экземпляра, например так:

class BookChapterReader : public std::tuple<Book,Chapter,Reader>
{
};

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

std::_Tree<std::_Tmap_traits<Library,BookChapterReader,std::less<Library>,std::allocator<std::pair<Library const ,BookChapterReader> >,0> >

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

Кажется, что C ++ (или Visual Studio?) Имеет ограничение:

  • Если я просто использую typedef, символы становятся слишком большими
  • Если я использую наследование, может показаться, что я хочу расширить std :: tuple, но я не хочу этого делать

Нет ли более чистого способа «переименовать» шаблонную установку без использования наследования?

3

Решение

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

std::map< Library, BookChapterReader, CompareLibrary, MyAllocator > m_data;

Класс распределителя очень прост, как и функтор сравнения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]