братья, поделитесь "современным" ( в духе С++ 11/14) трюком —
мне надо в шаблонной функции ввести "ограничение" — категория итератора должна быть рэндом эксесс.
я сделал тупо:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>братья, поделитесь "современным" ( в духе С++ 11/14) трюком - L_L>мне надо в шаблонной функции ввести "ограничение" — категория итератора должна быть рэндом эксесс.
template<class Iterator>
typename std::enable_if<
std::is_same<
typename std::iterator_traits<Iterator>::iterator_category,
std::random_access_iterator_tag>::value, Iterator>::type
some_algorithm(Iterator first, Iterator last)
{}
void test()
{
std::vector<int> a;
auto c = some_algorithm(a.begin(), a.end());
int e;
auto d = some_algorithm(&e, &e);
}
Здравствуйте, andyp, Вы писали:
A>Здравствуйте, Lorenzo_LAMAS, Вы писали:
A>
A>template<class Iterator>
A>typename std::enable_if<
A> std::is_same<
A> typename std::iterator_traits<Iterator>::iterator_category,
A> std::random_access_iterator_tag>::value, Iterator>::type
A> some_algorithm(Iterator first, Iterator last)
A>{}
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>отлично, диагностика компилятором выдается отменно читаемая!
Собственно, у подхода с enable_if есть одна грабля, о которой частенько забывают: enable_if не отлавливает ошибки (и рапортует, если что не так), а просто выкидывает функцию из overload set по SFINAE.
Соответственно, может неожиданно сработать что-то еще, что и не предполагалось, но залетело в overload set по какому-нть using или ADL, не говоря уже о сообщении об ошибке, в котором будет лишь написано, что функция не найдена.
В то время как обычно нам хочется иметь внятное и короткое сообщение об ошибке и больше ничего.
Для этого достаточно просто дополнительно объявить функцию-перехватчик для всех неподходящих типов аргументов, которая не будет делать ничего, кроме рапорта об ошибке.