C++ 重载变长模板函数的递归结束

C++ 重载变长模板函数的递归结束,c++,recursion,variadic-templates,variadic-functions,function-templates,C++,Recursion,Variadic Templates,Variadic Functions,Function Templates,给了我一个很好的解决方法。我试图以他的回答为基础: template<class T, size_t N> ostream& vector_insert_impl(ostream& lhs, const char*, const T& rhs) { return lhs << at(rhs, N); } template<class T, size_t N, size_t... I> ostream& vector_i

给了我一个很好的解决方法。我试图以他的回答为基础:

template<class T, size_t N>
ostream& vector_insert_impl(ostream& lhs, const char*, const T& rhs)
{
    return lhs << at(rhs, N);
}

template<class T, size_t N, size_t... I>
ostream& vector_insert_impl(ostream& lhs, const char* delim, const T& rhs)
{
    return vector_insert_impl<T, I...>(lhs << at(rhs, N) << delim, delim, rhs);
}

template <typename T, size_t... I>
ostream& vector_insert(ostream& lhs, const char* delim, const T& rhs, index_sequence<I...>) 
{
    return vector_insert_impl<T, I...>(it, delim, rhs);
}
模板
ostream和vector\u insert\u impl(ostream和lhs、const char*、const T和rhs)
{
返回lhs
是否有一种解决方法可以强制编译器选择“递归结束”函数,从而避免插入分隔符

您可以添加“
Next
”元素


避免模棱两可调用的最简单解决方案是在第二个重载中添加一个额外的
size\t
。这样,它只能用至少2个参数调用,而1个参数的情况将下降到第一个重载

template<class T, size_t N, size_t N2,  size_t... ARGS>
ostream& vector_insert_impl(ostream& lhs, const char* delim, const T& rhs)
{
    return vector_insert_impl<T, N2, I...>(...);
}
模板
ostream和vector\u insert\u impl(ostream和lhs、常量字符*delim、常量T和rhs)
{
返回向量_insert_impl(…);
}

可变长度模板函数不被视为三等公民

template<class T, size_t N>
ostream& vector_insert_impl(ostream& lhs, const char*, const T& rhs)
模板
ostream和vector\u insert\u impl(ostream和lhs、const char*、const T和rhs)

模板
ostream和vector\u insert\u impl(ostream和lhs、常量字符*delim、常量T和rhs)
然后,当您剩下1个值时,您可以在第一个函数和最后一个空包函数之间进行选择。这两个函数都没有首选项,因此您有一个模棱两可的调用。解决此问题的方法是在包为空的情况下,将其设置为无法调用可变大小写。您可以通过添加第二个非类型参数仅当有2个或更多值时才会调用它,如

template<class T, size_t N, size_t M, size_t... I>
ostream& vector_insert_impl(ostream& lhs, const char* delim, const T& rhs)
{
    return vector_insert_impl<T, M, I...>(lhs << at(rhs, N) << delim, delim, rhs);
}
模板
ostream和vector\u insert\u impl(ostream和lhs、常量字符*delim、常量T和rhs)
{
返回向量\u insert\u impl(lhs请生成一个。
template<class T, size_t N>
ostream& vector_insert_impl(ostream& lhs, const char*, const T& rhs)
template<class T, size_t N, size_t... I>
ostream& vector_insert_impl(ostream& lhs, const char* delim, const T& rhs)
template<class T, size_t N, size_t M, size_t... I>
ostream& vector_insert_impl(ostream& lhs, const char* delim, const T& rhs)
{
    return vector_insert_impl<T, M, I...>(lhs << at(rhs, N) << delim, delim, rhs);
}