在模板参数列表中转发声明类型名

Forward declare typename in template parameter list

我有一个具有以下签名的函数:

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

有没有一种方法可以重新排序模板参数,这样我就可以像这样调用函数:

doSomething<3,5>(someContainer);

而不是必须这样做:

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

这不是问题,如果我可以在 Last 之后移动 someCountainer,但是 Last 的默认值是从 Container 派生的。有没有办法在模板参数列表中转发声明 Container,或者任何实际上可以让我避免每次都必须添加 decltype(...) 的功能?

一种方法是重载:

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);
}

还有一个,虽然不是那么优雅,是为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)
{}