1

テンプレートパックの特殊化 (パラメーターなし) を持つ関数を作成しようとしていますが、関数の特殊化によって他の何かが出力されて停止する最後のメッセージまで、メッセージが出力されます。説明が本当に下手なので、ここに私がやろうとしていることのコードを投稿します。

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()パラメータのようなものUpdateStuff(T first, TT... second)と特殊化を1つだけ与えることで機能させるUpdateStuff(T first)ことができましたが、これが可能かどうかを知りたいfunction parameters 、質問の要約を示します。

  • UpdateStuff<TT...>();TT がdoubleコンパイル時だけの場合、最初の関数を使用しないのはなぜですか?
  • 関数パラメーターなしで達成しようとしていることを実行することは可能ですか?

事前に感謝します。私の質問に関連する何かを理解していない場合は、より詳しく説明していただければ幸いです。私の下手な英語で申し訳ありません。

4

1 に答える 1

1

はい、可能です。

ただし、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...>();
}
于 2016-07-05T13:53:21.957 に答える