如何使用 C++ 中给定的伪代码创建递归的可变参数函数?
How to create a variadic function that are recursive with the given pseudo code in C++?
我正在尝试制作一个可在以下示例中使用的递归可变参数模板函数。该示例没有任何实用性,仅用于帮助更好地理解我的要求。所以,基本上我有一个函数,它接受无限数量的相同类型的参数,并且它使用除最后一个参数以外的所有参数递归调用自身。然后,一旦它最终达到两个参数,下一个函数将作为函数的终止。我知道答案不是微不足道的,而且我不知道该怎么做。任何帮助或指导将不胜感激!谢谢
template <typename... Ts>
void test(int& a, int& b, Ts&... ts){
test(a, b, ... ); //all but the last parameter
//last parameter argument is processed here
}
void test(int& a, int& b){
//end of recursion
}
int main(int argc, char** argv){
int a = 3;
int b = 5;
int c = 6;
int d = 4;
test(a, b, c, d);
return 0;
}
我们可以转发元组中的参数并递减索引:
#include <cstddef>
#include <tuple>
#include <utility>
template <std::size_t I, typename Tuple>
void test_helper(Tuple&& tuple)
{
if constexpr (I != 0) {
test_helper<I - 1>(std::forward<Tuple>(tuple));
}
// for example
process(std::get<I>(std::forward<Tuple>(tuple)));
}
template <typename... Args>
void test(Args&&... args)
{
test_helper<sizeof...(Args) - 1>(std::forward_as_tuple(std::forward<Args>(args)...));
}
示例:
#include <cstddef>
#include <iostream>
#include <tuple>
#include <utility>
template <typename T>
void process(const T& arg)
{
std::cout << arg << '\n';
}
template <std::size_t I, typename Tuple>
void test_helper(Tuple&& tuple)
{
process(std::get<I>(std::forward<Tuple>(tuple)));
if constexpr (I != 0) {
test_helper<I - 1>(std::forward<Tuple>(tuple));
}
}
template <typename... Args>
void test(Args&&... args)
{
test_helper<sizeof...(Args) - 1>(std::forward_as_tuple(std::forward<Args>(args)...));
}
int main()
{
test(1, '2', "3", 4.0);
}
现在,更喜欢从左到右处理参数,这样更简单:
template <typename... Args>
void test(Args&&... args)
{
((void)process(std::forward<Args>(args)), ...);
}
使用 P1858 Generalized pack declaration and usage 从右到左处理会更容易,遗憾的是尚未采用:
template <typename... Args>
void test(Args&&... args)
{
test(std::forward<Args>(args)...[:-1]...);
if constexpr (sizeof...(Args) != 0) {
process(std::forward<Args>(args)...[-1]);
}
}
我正在尝试制作一个可在以下示例中使用的递归可变参数模板函数。该示例没有任何实用性,仅用于帮助更好地理解我的要求。所以,基本上我有一个函数,它接受无限数量的相同类型的参数,并且它使用除最后一个参数以外的所有参数递归调用自身。然后,一旦它最终达到两个参数,下一个函数将作为函数的终止。我知道答案不是微不足道的,而且我不知道该怎么做。任何帮助或指导将不胜感激!谢谢
template <typename... Ts>
void test(int& a, int& b, Ts&... ts){
test(a, b, ... ); //all but the last parameter
//last parameter argument is processed here
}
void test(int& a, int& b){
//end of recursion
}
int main(int argc, char** argv){
int a = 3;
int b = 5;
int c = 6;
int d = 4;
test(a, b, c, d);
return 0;
}
我们可以转发元组中的参数并递减索引:
#include <cstddef>
#include <tuple>
#include <utility>
template <std::size_t I, typename Tuple>
void test_helper(Tuple&& tuple)
{
if constexpr (I != 0) {
test_helper<I - 1>(std::forward<Tuple>(tuple));
}
// for example
process(std::get<I>(std::forward<Tuple>(tuple)));
}
template <typename... Args>
void test(Args&&... args)
{
test_helper<sizeof...(Args) - 1>(std::forward_as_tuple(std::forward<Args>(args)...));
}
示例:
#include <cstddef>
#include <iostream>
#include <tuple>
#include <utility>
template <typename T>
void process(const T& arg)
{
std::cout << arg << '\n';
}
template <std::size_t I, typename Tuple>
void test_helper(Tuple&& tuple)
{
process(std::get<I>(std::forward<Tuple>(tuple)));
if constexpr (I != 0) {
test_helper<I - 1>(std::forward<Tuple>(tuple));
}
}
template <typename... Args>
void test(Args&&... args)
{
test_helper<sizeof...(Args) - 1>(std::forward_as_tuple(std::forward<Args>(args)...));
}
int main()
{
test(1, '2', "3", 4.0);
}
现在,更喜欢从左到右处理参数,这样更简单:
template <typename... Args>
void test(Args&&... args)
{
((void)process(std::forward<Args>(args)), ...);
}
使用 P1858 Generalized pack declaration and usage 从右到左处理会更容易,遗憾的是尚未采用:
template <typename... Args>
void test(Args&&... args)
{
test(std::forward<Args>(args)...[:-1]...);
if constexpr (sizeof...(Args) != 0) {
process(std::forward<Args>(args)...[-1]);
}
}