2

同じ名前で異なる非型テンプレート パラメータを持つ 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 に格納できます。

4

1 に答える 1

0

どの問題を解決しようとしているのかは完全には明らかではありません。例を機能させようとしているだけの場合は、「bool」を「const bool&」に変更できます。これはあなたが望んでいたことを達成していますか?

template <typename T, typename U, void (T::*F)(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>(); }
};

Storage<Foo, bool, &Foo::foo> foo;
Storage<Bar, const bool&, &Bar::bar> bar;
于 2013-06-03T17:49:45.790 に答える