2010-12-14 12 views
0

C++テンプレート:テンプレートのインスタンス化された型への暗黙的な変換を使用してオーバーロードされた関数を選択する!

void fun(Int2Type<1>) {} 
void fun(Int2Type<2>) {} 
void fun(Int2Type<3>) {} 
void fun(Int2Type<4>) {} 

私はこの方法でこれらを呼びたい、

fun(1); // this should call first function 
fun(4); // this should call fourth function 

はそれを行うための方法がありますが、これらのオーバーロードされた関数を考えてみましょうか?我々はいくつかの実行時の値と同じことを行うことができそうならば、そう、これを言う、

fun(value); // value can be decided at runtime! 

または(上記の呼び出しで、引数はコンパイル時に知られていることに注意してください)それが不可能な場合は別の方法ですか?目標は、異なる関数は、異なる積分値に基づいて呼び出される必要があります!


EDIT

ところで、私は、次のいずれかを使用することはできません。

  1. いいえ、方法はありませんいくつかのSomeFuncTable funTable[] = {fun(Int2Type<1>(), fun(Int2Type<2>()}など
+0

私はこれが可能であることを心から疑っていますが、実際に存在する場合は答えを知りたいです。 – acron

+2

なぜ地球上ではないのですか? – Puppy

+0

あなたはInt2TypeがLokiに由来するとは言及していませんでした。 –

答えて

2

あなたは異なり、それを少し行うことができますfunc<1>()

または、元のコードをこのように呼び出すことができます。func(Int2Type<1>())

いずれにしても、これはすべてコンパイル時定数でのみ機能します。

+0

私はそれが実験するのが良いと思います。私は家に帰りましょう、私はこれらすべてで遊ぶ必要があります。投稿に感謝します。 :-) – Nawaz

+0

実際に[Int2Type](http://loki-lib.sourceforge.net/html/a00683.html)の全目的は、** int **から順番に**別個のタイプ**を作成することです異なる過負荷への呼び出しをディスパッチします。 –

2

を使用してswitch(value)

  • を使用してランタイム値をテンプレートパラメータとして使用する。あなたがすることができる唯一のことは、のようなものされています。それらはすべて同じthing-にジャンプテーブルを煮詰めるので、あなたが望むものを達成する方法、あるいは場合/他の大規模なシリーズが

    void fun(int x) { 
        switch(x) { 
        case 1: 
         fun(Int2Type<1>()); 
         break; 
        case 2: 
         fun(Int2Type<2>()); 
         break; 
        case 3: 
         fun(Int2Type<3>()); 
         break; 
        case 4: 
         fun(Int2Type<4>()); 
         break; 
        } 
    } 
    
  • 2

    をありません。それでおしまい。他の機能はまさにそれになるだろう。ちょうどジャンプテーブルを作ってください。関数ポインタの配列(最速)や、より柔軟なものをunordered_map<int, std::function<void()>>のように使用できます。

    あなたが独自のJITコンパイラを作成し、必要なときに新しいアセンブリコードをJITする必要がある場合を除き、ああ。あなたはそれをすることができます。しかし、あなたはまだ同じ問題に陥っているので、コード・パスを選択する方法、つまりジャンプ・テーブルまたはif/elseチェインになるという点は実際には分かりません。

    template<int N> void func(); 
    template<> void func<1>(){/*the body*/} 
    template<> void func<2>(){/*the body*/} 
    

    をそして、あなたは呼び出すことができます::

    関連する問題