1

テンプレートを特殊化する(パラメータはありません)関数を作成しようとしていますが、関数の特殊化によって何か他のものが印刷される最後のものまでメッセージが出力されます。やめる。 私はここで、説明本当に悪いんだと私は私が何をしようとしているのコードを投稿する:最初の注意点としてはVariadic Template Packに関数の指定を与える

template <typename T> 
constexpr void UpdateStuff() 
{ 
    std::cerr << "I am the last one :D" << std::endl; 

} 
template< typename T ,typename... TT> 
constexpr void UpdateStuff() 
{ 



    std::cerr << "I am NOT the last one :D"; 

    UpdateStuff<TT...>(); 

} 
int main() 
{ 


    UpdateStuff<int,double>(); // Should only print text twice 
    std::cin.get(); 

    return 1; 
} 

私はこれが動作しません知っている、UpdateStuff<TT...>();それは曖昧のコールを生成します関数をオーバーロードするには、のようなパラメータをUpdateStuff(T first, TT... second)と特殊化のみ1つをUpdateStuff(T first)に与えることによって動作させることができましたが、これが関数パラメータなしで可能かどうかを知りたいのですが、私は質問をま​​とめます:

  • I UpdateStuff<TT...>();がうまくいかない理由を完全に理解していない、TTがコンパイル時にdoubleの場合、なぜ最初の関数を使用しないのですか?
  • 私は機能パラメータなしで達成しようとしていることを行うことは可能ですか?

ご質問ありがとうございました。私の質問に関連することを理解していないと、私はそれをよりうまく説明することに感謝し、私の貧しい英語を申し訳ありません。

+0

私の推測では、 'UpdateStuff は()ということであるようなもの;' TT'が空パックとしてそこに推測されるように、 '' UpdateStuff'機能の両方のオーバーロードと一致します... –

答えて

0

はい、可能です。

しかし、typename ... TTは「0以上の型名」であるので、UpdateStaff<double>()の両方のバージョンをUpdateStaff()と呼んでも問題ありません。

最終バージョンではない場合は、2番目のタイプを指定することができます。この

template <typename T1, typename T2, typename... TT> 
constexpr void UpdateStuff() 
{ 
    std::cerr << "I am NOT the last one :D"; 

    UpdateStuff<T2, TT...>(); 
} 
+0

おかげで、あなたはたくさんの!そしてそれらの答えはかなり速かったです:D – Bollafa

関連する問題