Пропуск дефолтовых параметров в шаблонах и функциях

dreverser
dreverser

Хочется иметь возможность не перечислять параметры шаблона контейнера что бы добраться до нужного.

В моем случае пример с аллокатором в unordered_map. К которому что бы добраться приходится пройтись по двум дефолтовым параметрам hash и equal, накладно.

Так почему бы не дать возможность пропускать их  ?

вместо
typedef std::unordered_map<int, EVO, std::hash, std::equal_to, 
Alloc_wrapped<std::pair<const int, EVO> >

просто
typedef std::unordered_map<int, EVO,,, 
Alloc_wrapped<std::pair<const int, EVO> >

-5
рейтинг
6 комментариев
Artalus

Пропускать "неинтересные" параметры - хочется, но мне более удобным кажется вариант с

typedef std::unordered_map<int, EVO, Allocator = Alloc_wrapped<...> >

Artalus
dreverser

А если абстрактный шаблон имеет два одинаковых типа ? тогда отличить к чему резолвить указанный тип невозможно

Я искал любой способ добраться до указания нужного мне аргумента.

Если уже все значения аргументов определены в декларации. То почему бы просто их не пропускать.

Возможно можно придумать некоторый квалификатор который бы коротким.

И указывал компилятору использовать значение по умолчанию если такое существует, лиюбо выдавал ошибку.

dreverser
stepsoft

Всегда можно упростить запись, например так

template < typename _Key, typename _Value, typename _Alloc >
using my_map = std::unordered_map< _Key, _Value, std::hash< _Key >, std::equal_to< _Key >, _Alloc >;

my_map<const int, EVO, Alloc_wrapped<std::pair< const int, EVO > > value;

И использовать сокращеный вариант шаблона. А лишние запятые приведут только к ошибкам и отсутствию наглядности.

stepsoft
dreverser

Да я в курсе про алиясинг, он может спасти только в одном случае, если этот шаблон алиясинга мы применяем очень много раз

На практике у меня такое редко встречается. Каждый контейнер уникальный

Я все же считаю что С++ должен эволюционировать в сторону уменьшения избыточности а не наоборот.

Как альтернатива я уже предложил придумать какой то кейворд для стандарта, который бы означал использовать значение по умолчанию

dreverser
al-mission-2016

 

Годная идея!

Кстати, dreverser, такой «кейворд» уже есть => «default»

 

al-mission-2016
al-mission-2016

 

Стоит обобщить идею «пропуска параметров, заданных по умолчанию».
Нужно заметить, что та же проблема стоит и для фактических аргументов функций (шаблонных и не шаблонных), если она имеет формальные параметры, заданные по умолчанию.

Предложение таково. Использовать ключевое слово «default» для указания компилятору использовать в точке вызова функции параметр по умолчанию, e.g. foo(0, default, 1). Причём это расширение C++ должно использоваться и для фактических аргументов функций, и для фактических аргументов шаблонов.

Аргументы в пользу этой feature.
0) востребовано (по сути - всегда, когда имеется более одного параметра по умолчанию)
1) ключевое слово уже есть: default
2) наглядность (вплоть до синтаксической подсветки в IDE);
синтаксис лучше чем с пропуском параметров через запятую(0, default, 1) vs (0,,1);
последний синтаксис компактнее, но путанее
3) не конфликтует с имеющимися языковыми конструкциями ибо «default» не может возникнуть в контексте передачи аргументов;
в частности, нет конфликта с перегруженными параметрами
4) относительно легко реализуется :) ~> в парсере фактических аргументов добавить:
if ( atom == KW_DEFAULT ) { substitute_with_default_formal_param() ; }
5) возможность эфективнее пользоваться уже имеющийся в языке возможностью задавать параметры по умолчанию.

На практике, при использовании более одного параметра по умолчанию, разработчику интерфейса нельзя однозначно выбрать порядок следования defaul-arguments. В результате, хотя значения по умолчанию имеются, использовать их вызывающей стороной не всегда возможно, т.е. приходится дублировать значения аргументов, что снижает ценность default-parameters-feature.

Example with function.

// declaration
void foo(int a1 = 1, short a2 = 2, double a3 = 3.14);
// invocation point
foo(default, default, 2.71);

Example with template:
using Bar = std::unordered_map<int, EVO, default, default, Alloc_wrapped<std::pair<const int, EVO>>;

al-mission-2016
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения