C++ 如何在递归模板函数中第一次调用时执行函数?
问题标题说明了这一切,那么如何在递归模板函数的第一次调用中执行函数呢?C++ 如何在递归模板函数中第一次调用时执行函数?,c++,templates,c++11,recursion,variadic-functions,C++,Templates,C++11,Recursion,Variadic Functions,问题标题说明了这一切,那么如何在递归模板函数的第一次调用中执行函数呢? 我曾想过在函数签名中使用默认变量,但没有一个地方变量不会干扰函数签名的其余部分。我的意思是: template<typename T, typename... Ts> void print(T first, Ts... params) { ... } 有什么想法吗?可以试试静态变量 template<typename T, typename... Ts> void print(T first, T
我曾想过在函数签名中使用默认变量,但没有一个地方变量不会干扰函数签名的其余部分。我的意思是:
template<typename T, typename... Ts>
void print(T first, Ts... 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;
}
模板
无效打印(T优先,Ts…参数)
{
打印中的静态布尔=假;
如果(!in_print)//魔术!
{
foo();
std::cout可能会有帮助(如果我正确理解您的问题):
模板
无效打印(T优先,Ts…参数)
{
静态无符号整数中心=0;
如果(…)//魔术!
foo();
std::cout解决此问题的一种方法是使用多个函数。外部函数进行额外调用,然后调用递归内部函数:
可能有两个函数?第一个函数执行额外的调用,然后调用第二个执行递归的函数。@Galik我想这会起作用:)谢谢你,你想知道的是,这是第一次调用这个函数吗?@Kason,不完全是。我想在第一次调用另一个函数时调用一个函数,但是另一个函数是递归的,因此我的问题
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