私は持っています
template <int i> struct a { static void f (); };
コード内のさまざまな場所で特殊化が行われます。実行時にのみ既知の正しいものa<i>::f
を呼び出すにはどうすればよいですか?i
void f (int i) { a<i>::f (); } // won't compile
i
の可能なすべての値を大きな値でリストしたくありませんswitch
。
編集:
私は次のようなことを考えました
#include <iostream>
template <int i> struct a { static void f (); };
struct regf {
typedef void (*F)();
enum { arrsize = 10 };
static F v[arrsize];
template < int i > static int apply (F f) {
static_assert (i < arrsize, "");
v[i] = a<i>::f;
return 0;
}
};
regf::F regf::v[arrsize];
template <int i> struct reg { static int dummy; };
template <int i> int reg<i>::dummy = regf::apply<i> ();
void f (int i) { return regf::v[i] (); }
#define add(i) \
template <> struct a<i> : reg<i> { \
static void f () { std::cout << i << "\n"; } \
};
add(1)
add(3)
add(5)
add(7)
int main () {
f (3);
f (5);
}
しかし、それはクラッシュし(インスタンス化を強制するために何かを逃したのですか?)、ダミーがそうではないstatic const
(そしてメモリを使用する)ことは好きではありません。もちろん、それarrsize
は必要以上に大きいです。
実際の問題:実行時にのみ指定されたクラスのインスタンスを生成するためgenerate (int i)
に呼び出す関数を持つこと。デザイン(クラス)が与えられ、それらは基本クラスから継承され、コードのどこにでもいつでもより多くの特殊化を追加できますが、それは簡単に忘れられる可能性があるため、すべての人に手動で変更するように強制したくありません。a<i>::generate ()
a<i>
i
a<i>
generate (i)