Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在递归模板函数中第一次调用时执行函数?_C++_Templates_C++11_Recursion_Variadic Functions - Fatal编程技术网

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