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

lig*_*ulb 3 c++ templates typename non-type c++17

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

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

有没有一种方法可以允许对模板参数进行重新排序,所以我可以像下面这样调用函数:

doSomething<3,5>(someContainer);
Run Code Online (Sandbox Code Playgroud)

不必这样做:

doSomething<decltype(someContainer), 3,5>(someContainer);
Run Code Online (Sandbox Code Playgroud)

这不会是一个问题,如果我能够继续前进someCountainerLast,但默认值Last源自Container。有没有一种方法可以Container在模板参数列表中转发声明,或者有什么功能可以使我避免decltype(...)每次都添加?

Max*_*kin 7

一种方法是重载:

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);
}
Run Code Online (Sandbox Code Playgroud)


Evg*_*Evg 5

另一个虽然不那么优雅的方法是对以下项使用哨兵值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)
{}
Run Code Online (Sandbox Code Playgroud)