在模板参数列表中转发声明类型名
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)
{}
我有一个具有以下签名的函数:
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)
{}