Еще раз, я хотел бы C++ была сильнее typedef
S:Как сделать работу типа шаблона в этом случае?
#include <vector>
template<typename T>
struct A {
typedef std::vector<T> List;
};
template<typename T>
void processList(typename A<T>::List list) {
// ...
}
int main() {
A<int>::List list;
processList<int>(list); // This works.
processList(list); // This doesn't.
}
Очевидно, что компилятор видит list
как std::vector<int>
и не A<int>::List
, поэтому он не может соответствовать его против A<T>::List
, что, как ожидается.
В самом деле, это более длинное имя типа, часто повторяющееся, и это неприятность. Вместо того, чтобы позволить processList
принять vector
вместо этого, есть ли способ сделать операцию типа шаблона для меня?
Хм, хороший момент. Наверное, я не очень люблю «идиоматику», потому что это для внутреннего использования только внутри одного класса. Передавая (ссылка на ..., о которой я не упоминал в этом упрощенном примере), сама вещь делает более короткий код на сайте вызова. – Thomas
Я передал вектор по значению для простоты примера. На практике я, конечно, передаю ссылку на const. Ваше обновление является опрятным; не то, что я буду использовать его (я не отчаянный), но хорошо иметь в виду. – Thomas
+1 но будьте осторожны (для редактирования), что стандартные контейнеры не имеют фиксированного количества аргументов - это реализация определена, реализация просто должна предоставлять значения по умолчанию для любых дополнительных аргументов шаблонов, чтобы экземпляры, которые предполагают подписи присутствующих в стандартном компиляции. –