ДО ТОГО, ЧТО ВЫ ПРОЧИТАЕТЕ: const_reference
является typedef и не нуждается в const T&
, как вы можете видеть в std::vector<bool>::const_reference = bool
. Пожалуйста, имейте это в виду, читая остальное, чтобы понять это правильно (как это предложено в кометах, это трудно для многих людей).
Я хотел использовать контейнеры STL для простых типов (например, int
) и обнаружил, что они используют недооптимальный const T&
"анти-шаблон" - он хорошо работает для больших классов, но не оптимален для простых/основные типы, если они не включены - рассмотрите встроенную систему, например на ARM/ATSAM4L, с инстанцированием.
Вопрос: почему именно? vector::push_back
изменен с аргументом (const value_type&)
вместо (Allocator::const_reference
), так как С++ 11?
Он должен быть одинаковым для общего allocator
, но при этом другой способ помог мне написать собственный распределитель (или специализированную специализацию) для фундаментальные типы, которые определяли бы const_reference
как сам тип (см. vector<bool>::const_reference = bool
).
Вопрос 2: Есть ли какой-либо адаптерный класс, который может сделать это для меня?
Что-то вроде этого:
template<class T, class base = std::vector<T> >
class myvect: protected base {
public:
typedef T const_reference;
void push_back(const_reference value) {
base::push_back(value); }}
Конечное использование будет таким:
typedef void (*action_t)(void*,int);
extern "C" void work(void *, action_t);
work(&vect, (action_t)&vect::push_back);
( примечание: игнорировать возможные проблемы с литьем в предыдущем блоке кода, надеюсь, вы получили эту идею.)
EDIT: vector::const_reference
определяется непосредственно как const value_type&
, но, на мой взгляд, должен быть определен как Alloc::const_reference
, который затем можно легко изменить (vector<int, MyAllocator<int> >
). (Это было изменено в С++ 11, оно было определено как Alloc:: const_reference, но теперь const value_type &)
РЕДАКТИРОВАТЬ: func(const T&)
иногда описывается как "анти-шаблон" здесь, в stackoverflow, потому что он не оптимален для базовых типов без инкрустации (да, компилятор генерирует оптимальный код даже для func(const int&)
, если он встраивается, но вот что IF. func(int)
будет лучше работать)
ЗАКЛЮЧЕНИЕ: Сама проблема, по-видимому, связана с поведением const
и, следовательно, const T&
. const
на самом деле не означает, что он не изменится, но не изменится, и поэтому const T&
необходимо (и четко определено и использовано) как тип возврата для многих методов. Создание пользовательского класса адаптера представляется наилучшим способом оптимизации и, как представляется, широко принято, что std::vector<bool>
является нечетным исключением, которое должно быть в отдельном классе (например, dynamic_bitset
).