Jon*_*Mee 5 c++ recursion variadic-functions function-templates variadic-templates
FrançoisAndrieux为我解决了Visual Studio 2017问题提供了一个很好的解决方法。我试图像这样回答他:
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);
}
Run Code Online (Sandbox Code Playgroud)
关键区别在于,“递归结束”模板函数实际上将最后一个值插入ostream,而不是分隔符,而不是无操作。但是当我尝试编译它时,我得到了错误:
错误C2668 ::
vector_insert_impl对重载函数的歧义调用(编译源文件.... \ src \ STETestbed \ Test.cpp)
注意:可能是std::ostream &vector_insert_impl<T,2,>(std::ostream &,const char *,const T &)
注意:或std::ostream &vector_insert_impl<T,2>(std::ostream &,const char *,const T &)
我以为长度可变的模板功能被认为是3 个二等公民和固定长度的模板函数将始终是首选。该首选项在这里似乎无效。有没有变通办法,将迫使编译器选择我的“递归结束”功能,使我避免插入定界符?
是否有一种解决方法可以强制编译器选择我的“递归结束”函数,使我能够避免插入分隔符?
您可以添加“ Next”元素
template <typename T, std::size_t N>
std::ostream & vector_insert_impl (std::ostream & lhs, char const *, T const & rhs)
{
return lhs << at(rhs, N);
}
// ..................................vvvvvvvvvvvvvvvv
template <typename T, std::size_t N, std::size_t Next, std::size_t ... I>
std::ostream & vector_insert_impl (std::ostream & lhs, char const * delim, T const & rhs)
{ // ............................vvvv
return vector_insert_impl<T, Next, I...>(lhs << at(rhs, N) << delim, delim, rhs);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你可以使用 C++17,我想if constexpr这是一个更好的解决方案
template <typename T, std::size_t N, std::size_t ... Is>
std::ostream & vector_insert_impl (std::ostream & lhs, char const * delim, T const & rhs)
{
if constexpr ( sizeof...(Is) )
return vector_insert_impl<T, Is...>(lhs << at(rhs, N) << delim, delim, rhs);
else
return lhs << at(rhs, N);
}
Run Code Online (Sandbox Code Playgroud)