如何在递归模板函数中首次调用时执行函数?
How to execute a function on first call in a recursive template function?
问题标题说明了一切,那么如何在递归模板函数中的第一次调用时执行函数?
我想过在函数签名中使用默认变量,但没有一个地方变量不会干扰函数签名的其余部分。这就是我的意思:
template<typename T, typename... Ts>
void print(T first, Ts... params) { ... }
注意:我正在使用 bool
(b
) 来确定函数是否不是从自身调用的。
void print(bool b = true, T first, Ts... params);
。如果仅使用 1 个参数(即 print("hello");
)调用则不起作用,因为编译器使用 "hello"
. 初始化 b
void print(T first, bool b = true, Ts... params);
。不适用于多个参数(即 print("hello", "world", "again");
),因为编译器使用参数包中的第二个参数初始化 b
..
void print(T first, Ts... params, bool b = true);
。与2
相同,只是b
是用参数包中的最后一个参数初始化的。
我想要的是这样的东西(或者如果你想要的话,其他涉及模板参数的东西(或者完全不同的东西))
template<typename T, typename... Ts>
void print(T first, Ts... params)
{
if (...) // Magic!
foo();
std::cout << first << '\n';
print(params...);
}
有什么想法吗?
可以试试静态变量..
template<typename T, typename... Ts>
void print(T first, Ts... params)
{
static bool in_print = false;
if (!in_print) // Magic!
{
foo();
std::cout << first << '\n';
}
in_print = true;
print(params...);
in_print = false;
}
也许它会有所帮助(如果我正确理解你的问题):
template<typename T, typename... Ts>
void print(T first, Ts... params)
{
static unsigned int ctr = 0;
if (...) // Magic!
foo();
std::cout << first << '\n';
ctr++;
print(first, params...);
}
解决这个问题的一种方法是拥有多个函数。外部函数进行额外调用,然后调用递归内部函数:
void foo()
{
std::cout << "foo\n";
}
// satisfy the zero-parameter case
void internal_print()
{
}
// inner recursive function
template<typename T, typename... Ts>
void internal_print(T first, Ts... params)
{
std::cout << first << '\n';
internal_print(params...);
}
// outer special case function
template<typename... Ts>
void print(Ts... params)
{
foo();
internal_print(params...);
}
int main()
{
print(1, 2, "three", 4.0);
}
输出:
foo
1
2
three
4
问题标题说明了一切,那么如何在递归模板函数中的第一次调用时执行函数?
我想过在函数签名中使用默认变量,但没有一个地方变量不会干扰函数签名的其余部分。这就是我的意思:
template<typename T, typename... Ts>
void print(T first, Ts... params) { ... }
注意:我正在使用 bool
(b
) 来确定函数是否不是从自身调用的。
void print(bool b = true, T first, Ts... params);
。如果仅使用 1 个参数(即print("hello");
)调用则不起作用,因为编译器使用"hello"
. 初始化 void print(T first, bool b = true, Ts... params);
。不适用于多个参数(即print("hello", "world", "again");
),因为编译器使用参数包中的第二个参数初始化b
..void print(T first, Ts... params, bool b = true);
。与2
相同,只是b
是用参数包中的最后一个参数初始化的。
b
我想要的是这样的东西(或者如果你想要的话,其他涉及模板参数的东西(或者完全不同的东西))
template<typename T, typename... Ts>
void print(T first, Ts... params)
{
if (...) // Magic!
foo();
std::cout << first << '\n';
print(params...);
}
有什么想法吗?
可以试试静态变量..
template<typename T, typename... Ts>
void print(T first, Ts... params)
{
static bool in_print = false;
if (!in_print) // Magic!
{
foo();
std::cout << first << '\n';
}
in_print = true;
print(params...);
in_print = false;
}
也许它会有所帮助(如果我正确理解你的问题):
template<typename T, typename... Ts>
void print(T first, Ts... params)
{
static unsigned int ctr = 0;
if (...) // Magic!
foo();
std::cout << first << '\n';
ctr++;
print(first, params...);
}
解决这个问题的一种方法是拥有多个函数。外部函数进行额外调用,然后调用递归内部函数:
void foo()
{
std::cout << "foo\n";
}
// satisfy the zero-parameter case
void internal_print()
{
}
// inner recursive function
template<typename T, typename... Ts>
void internal_print(T first, Ts... params)
{
std::cout << first << '\n';
internal_print(params...);
}
// outer special case function
template<typename... Ts>
void print(Ts... params)
{
foo();
internal_print(params...);
}
int main()
{
print(1, 2, "three", 4.0);
}
输出:
foo
1
2
three
4