2016-05-04 25 views
1

私は機能関数の引数として0,1,2、...、N-1を渡す

template <typename T, typename... Args> void foo(const T&, Args...); 

を持っていると私は何か渡したい:

foo(vector, 0,1,2,3,..., vector.size() - 1); 

vectorを何らかの種類のベクトルです。 std::make_index_sequenceを使用することはできません。vector.size()はコンパイル時定数ではないためです。上記の構造は可能ですか(例えば、std::iotaをヘルパーとして使用します)、0から無限大までの線形検索を行わずに、vector.size()はどれですか?

+1

多分私は質問を完全に誤解していますが、私はほとんど確信していますが、 'vector、0,1,2,3 ...、vector.size() - 1'を渡すポイントは何ですか? 'vector'を渡すと、同じ情報がその関数に渡されますか? – user463035818

答えて

6

いいえ、バイナリ検索やルックアップテーブルを使用できますが、それでもO(最大size_t^2)のコードが生成されます。

多くのコードが生成され、恐ろしい死を迎えることはほとんどありません.64ビットコンピュータでは、関数名の長さだけで10^37の順番で話しています。現在の惑星地球のコピーを可視宇宙全体のすべての星の周りに置き、それらの地球のコンピュータ記憶装置のすべてを使用して関数名のリストを保存するだけで、これらの関数名をすべて格納するのは実用的です。

これを行うには、コンパイラの限界に遭遇するでしょうが、私はicpcを試していません。

小さな制限(1000など)を選択した場合は、より実用的に行うことができます。コンパイル時の定数に比較的小さな上限があるので、私はmagic switch(実行時の値をコンパイル時の定数にディスパッチする)という問題を解決します。

まだ、あなたの計画に問題があります。

+0

_おそらく**コンパイラの限界に走ります_。大好きです。 :-) – skypjack

関連する問題