在模板参数列表中提前声明类型名称

3

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

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
你确定在这里使用FirstLast的模板参数是正确的选择,而不是例如带有默认值的普通函数参数吗? - Some programmer dude
@Evg 因为 Last 没有看到 Container? - lightxbulb
是的,但您需要删除默认值。此外,我不认为auto在这种情况下是标准C++。 - Cruz Jean
@lightxbulb,好的。 :) - Evg
@Someprogrammerdude 是的 - 这是一个编译时循环,位于此函数内(需要编译时非类型变量)。 - lightxbulb
@CruzJean 这是c++17,你可以像这样使用auto。虽然在我的原始示例中我有decltype(Container::size()) First,但我决定放松它,因为如果对于放松的问题没有解决方案,那么对于带有decltype的问题也不会有解决方案,这就是我想到的。 - lightxbulb
2个回答

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接