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)
这不会是一个问题,如果我能够继续前进someCountainer后Last,但默认值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);
}
Run Code Online (Sandbox Code Playgroud)
另一个虽然不那么优雅的方法是对以下项使用哨兵值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)