同じ名前で異なる非型テンプレート パラメータを持つ 2 つのテンプレート クラスを使用することは可能ですか?
template <typename T, typename U, void (T::*F)(U)> void common() { ... }
template <typename T, typename U, void (T::*F)(const U &)> void common() { ... }
struct Foo
{
void foo(bool) {}
}
struct Bar
{
void bar(const bool &) {}
}
template <typename T, typename U, void (T::*F)(U)> struct Storage
{
Storage() { common <T, U, F>(); }
}
template <typename T, typename U, void (T::*F)(const U &)> struct Storage
{
Storage() { common <T, U, F>(); }
}
Storage<Foo, bool, &Foo::foo> foo;
Storage<Bar, bool, &Bar::bar> bar;
このようなメカニズムを持つ理由は、同じマクロを使用して両方を作成できる必要があるためです。
#define STORAGE(T, U, F) Storage<T, U, F> BOOST_PP_CAT(storage, __LINE__);
STORAGE(Foo, bool, &Foo::foo)
STORAGE(Bar, bool, &Bar::bar)
ご意見ありがとうございます。
編集
さらなる入力が役立つ場合があります。
私が達成したいのは、初期化時に実行されるメソッドです。私はそのようなメソッドを提供することができます - または、2 つのオーバーロードされたメソッドを提供することができます。しかし、初期化時にそれらを実行するには、通常、コンストラクターでこのメソッドを呼び出すスタブ クラス (この場合は Storage など) を用意します (初期化時に、STORAGE マクロがスタブ クラスのインスタンスを作成するため)。
同じ STORAGE マクロを使用するには、関数を実行するために持っているスタブ クラスに同じテンプレートの非型の「オーバーロード」が必要です (また、コンストラクターではなくクラスをテンプレート化する必要があります。これは確かにオーバーロードできます)。 、コンストラクターのテンプレート パラメーターを明示的に指定することはできず、テンプレート パラメーターは非型であるため、それらを推測することもできないためです)。
編集
メンバー関数へのポインターは、非テンプレートの静的メソッドでラップされるため、コンパイル時の値 (非型のテンプレート パラメーター) である必要があります。これは、実行時に利用可能な std::vector に格納できます。