2016-04-01 4 views
1

質問タイトルはそれをすべて言っているので、再帰的テンプレート関数の最初の呼び出しで関数をどのように実行しますか? 再帰的テンプレート関数の最初の呼び出しで関数を実行する方法は?


私は関数シグネチャでデフォルト変数を使用することを考えましたが、変数が関数シグネチャの残りの部分と干渉しない場所はありません。ここでは、私の意味は次のとおりです。

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

注:私は、関数が自身から呼び出されなかったかどうかを判断するためにboolb)を使用しています。

  1. void print(bool b = true, T first, Ts... params);。コンパイラがb"hello"で初期化するため、1つの引数(つまり、print("hello");)で呼び出すと機能しません。
  2. void print(T first, bool b = true, Ts... params);。コンパイラがパラメータパックの2番目のパラメータでbを初期化するため、複数の引数(つまりprint("hello", "world", "again");)では機能しません。
  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

は多分二つの機能を持っていますか?最初の関数は余分な呼び出しを行い、再帰を行う2番目の関数を呼び出します。 – Galik

+0

@Galik私はそれがうまくいくと思います:)ありがとう – Rakete1111

+0

あなたが知りたいことは、それがこの機能を初めて呼び出すのですか? – Kason

答えて

1

一つの方法は、2つ以上の機能を持っていることです。外側の関数は、余分な呼び出しを行い、その後、再帰的な内部機能(複数可)calles:

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 
1

は(私はcorectlyあなたの問題を理解していれば)

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

多分それは役立ちます。..静的変数を試みることができる。これを解決する

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...); 
} 
関連する問題