2016-06-19 14 views
1

関数ポインタのテーブルを初期化する次のコードがあります。このテーブルは、入力ファイルが解析されるときに使用されます。テンプレートクラスの静的メソッドの関数ポインタ

class TorchModule { ... }; 
class TorchLinear : public TorchModule { ... }; 
class TorchView : public TorchModule { ... }; 
... 
typedef std::shared_ptr<const TorchModule> (*load_function)(File* file); 

using table_type = std::map< std::string, load_function > table_type; 

table_type load_Object = { 
    {"nn.Linear", &TorchLinear::load }, 
    {"nn.View" , &TorchView ::load } 
}; 

ベースクラスのTorchModuleがテンプレートクラスの場合は、コードをどのように更新できますか?

template<MODE mode> 
class TorchModule { ... }; 
template<MODE mode> 
class TorchLinear : public TorchModule<mode> { ... }; 
template<MODE mode> 
class TorchView : public TorchModule<mode> { ... }; 
+1

あなたのやりたいことを明確にしません。 'TorchModule'はそのサブクラスにどのような影響を与えますか?テンプレートパラメータ 'mode'はどこで使用されますか? [mcve] –

+0

を提供してくださいこれはまだ完全な**例ではありません。 'load_Object'はどこに格納されていますか?これはグローバル変数ですか?または別のタイプのメンバーですか?どこが初期化されていますか?現在の実装でそのマップをどのように使用するかを示します –

答えて

2

テーブルを静的変数としてテンプレートクラスに定義することができます。

template<MODE mode> 
using load_function = std::shared_ptr< const TorchModule<mode> > (*)(File* file); 

template<MODE mode> 
using table_type = std::map< std::string, load_function<mode> >; 

template<MODE mode> 
struct Table { 
    static table_type<mode> table; 
}; 

template<MODE mode> 
table_type<mode> Table<mode>::table = { 
    {"nn.Linear", &TorchLinear<mode>::load }, 
    {"nn.View" , &TorchView<mode> ::load } 
}; 

  • IはC++ 11のテンプレートエイリアス(使用)を使用しました。 C++ 98では、typedefをテンプレートクラスに入れることができます。
  • 使用されるすべてのモードごとに1つのテーブルインスタンスが存在します。
  • C++ 14では、クラス内でテーブルを定義する代わりにテンプレート変数を使用できます。
  • モードによってテンプレート化されたクラスにすべてを入れて、テンプレートパラメータがソリューションのすべての部分に伝播しないようにするには、コードを読みやすくすることができます。
+0

テンプレート化された 'TorchModule'の中で' template'と 'typename'キーワードを使う必要があるかもしれません(関連:http://stackoverflow.com/questions/610245/template-and-typename-keywordsをどこに置く必要があるか) –

関連する問題