14

私は次のコードのようなものを持っています:

   template<typename T1, typename T2, typename T3, typename T4>
   void inc(T1& t1, T2& t2, T3& t3, T4& t4) { ++t1; ++t2; ++t3; ++t4; }

   template<typename T1, typename T2, typename T3>
   void inc(T1& t1, T2& t2, T3& t3) { ++t1; ++t2; ++t3; }

   template<typename T1, typename T2>
   void inc(T1& t1, T2& t2) { ++t1; ++t2; }

   template<typename T1>
   void inc(T1& t1) { ++t1; }

今後の標準から提案された可変個引数テンプレートを使用して、それを再実装したいと思います。ただし、これまでオンラインで見たすべての例はprintfのような例のようですが、ここでの違いは参照の使用にあるようです。私は次のことを思いついた:

inline void inc() { }

template<typename T>
inline void inc(T&& t) { ++t; }

template<typename T,typename ... Args>
inline void inc(T&& t, Args&& ... args) { ++t; inc(args...); }

私が知りたいのは:

  • 参照の代わりにr値を使用する必要がありますか?

  • 私が望むことを正しく達成する方法についての可能なヒントまたは手がかり。

  • 再帰関数呼び出しの問題に関して、新しく提案された標準はどのような保証を提供しますか?上記の可変個引数バージョンが元のバージョンと同じくらい最適であるという兆候はありますか?(インラインまたはそのようなものを追加する必要がありますか?)

4

3 に答える 3

13

ここでは右辺値参照を使用しません。これにより、次のような無意味なコードを許可する右辺値にバインドできるようになるためです。

inc(1);

したがって、私は通常の参照に固執します。

template<typename T>
void inc(T& t) { ++t; }

template<typename T,typename ... Args>
void inc(T& t, Args& ... args) { ++t; inc(args...); }
于 2010-04-11T05:32:27.887 に答える
2

参照の代わりに r 値を使用する必要がありますか?

右辺値参照のことですか?いいえ、それらの理由はわかりません。

私が望むことを正しく達成する方法に関するヒントや手がかり。

あなたはすでにそこにいます。あなたのコードはあなたが望むことをするべきです。

新しい提案された標準は、再帰関数呼び出しの問題に関してどのような保証を提供しますか?上記の可変引数バージョンが元のバージョンと同じくらい最適であるという兆候はありますか? (インラインなどを追加する必要がありますか?)

C++ 標準では、インライン展開は保証されていません。コンパイラが生成するものを確認できます。最上位の inc-call を含め、すべてをインライン化する場合は、リクエストとして両方の関数にインライン化することができます。非可変個のテンプレートのようなものが必要な場合は、次のようにラップできます。

inline void inc_impl() {}

template<typename T, typename...U>
inline void inc_impl(T& t, U&...u) { ++t; inc_impl(u...); }

template<typename...T>
void inc(T&...t) { inc_impl(t...); }

inc はインラインではありませんが、 inc_impl 呼び出しのインライン化が行われると、その実装のそれぞれにはおそらく実際の関数呼び出しは含まれませんが、保証はありません。

于 2010-04-11T05:49:46.690 に答える
1

新しい提案された標準は、再帰関数呼び出しの問題に関してどのような保証を提供しますか?上記の可変引数バージョンが元のバージョンと同じくらい最適であるという兆候はありますか? (インラインなどを追加する必要がありますか?)

標準は、最適化が実行されることを保証しません。動作と結果のみを指定します。関数がインライン化されるかどうかは実装の問題です。

実際、 inline キーワードは、コンパイラがより適切に判断できるため、無視されることが多いコンパイラへのヒントにすぎません。

inc最後に、g++-4.5 では のすべての関数が完全にインライン化されました-O2。それがあなたの望むものかどうかはわかりません。

于 2010-04-11T05:52:16.637 に答える