如何在递归模板函数中第一次调用时执行函数?

时间:2016-04-01 04:13:47

标签: c++ templates c++11 recursion variadic-functions

问题标题说明了一切,那么如何在递归模板函数的第一次调用中执行函数?

<小时/> 我想过在函数签名中使用默认变量,但是没有一个地方变量不会干扰函数签名的其余部分。这就是我的意思:

template<typename T, typename... Ts>
void print(T first, Ts... params) { ... }

注意:我正在使用boolb)来确定该函数是否未从其自身调用。

  1. void print(bool b = true, T first, Ts... params);。仅使用1个参数(即print("hello");)调用时不起作用,因为编译器使用b初始化"hello"
  2. void print(T first, bool b = true, Ts... params);。不适用于多个参数(即print("hello", "world", "again");),因为编译器使用参数包中的第二个参数初始化b
  3. void print(T first, Ts... params, bool b = true);。与2相同,但使用参数包中的最后一个参数初始化b
  4. 我想要的是这样的东西(或其他涉及模板参数的东西,如果你想要(或完全不同的东西))

    template<typename T, typename... Ts>
    void print(T first, Ts... params)
    {
        if (...) // Magic!
            foo();
        std::cout << first << '\n';
    
        print(params...);
    }
    

    有什么想法吗?

3 个答案:

答案 0 :(得分:1)

可以尝试静态变量..

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;
}

答案 1 :(得分:1)

解决此问题的一种方法是拥有多个功能。外部函数进行额外调用,然后调用递归内部函数:

git rev-parse --short

<强>输出:

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);
}

答案 2 :(得分:-1)

也许它会有所帮助(如果我理解你的问题):

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...);
}
相关问题