ДО ТОГО, ЧТО ВЫ ПРОЧИТАЕТЕ: 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).