Вперед объявить typename в списке параметров шаблона - PullRequest
3 голосов
/ 04 июля 2019

У меня есть функция со следующей подписью:

template<typename Container, auto First = 0, auto Last = Container::size()>
doSomething(const Container& containter){...}

Есть ли способ, который позволит изменить порядок параметров шаблона, поэтому я мог бы вызвать функцию следующим образом:

doSomething<3,5>(someContainer);

Вместо того, чтобы делать это:

doSomething<decltype(someContainer), 3,5>(someContainer);

Это не было бы проблемой, если бы я мог двигаться someCountainer после Last, однако значение по умолчанию Last получено из Container. Есть ли способ пересылки объявлений Container в списке параметров шаблона или какой-либо функциональности, которая позволила бы мне избежать необходимости добавлять decltype(...) каждый раз?

Ответы [ 2 ]

7 голосов
/ 04 июля 2019

Один из способов перегрузки:

template<auto First, auto Last, typename Container>
void doSomething(const Container& containter);

template<auto First, typename Container>
void doSomething(const Container& containter) {
    doSomething<First, Container::size()>(containter);
}

template<typename Container>
void doSomething(const Container& containter) {
    doSomething<0, Container::size()>(containter);
}
5 голосов
/ 04 июля 2019

И еще один способ, хотя и не такой элегантный, - использовать значение часового для Last:

template<auto F = 0, auto L = -1, typename Container, 
    typename Container::size_type First = F, 
    typename Container::size_type Last = (L == -1) ? Container::size() : L>
void do_something(const Container& containter)
{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...