2017-11-08 8 views
0

私は、学生のコレクションを格納するプログラムの作成に取り組んでいます。基本的に同じクラス/クラスのコンテナを作成するために、同じコピー/ペーストコードを基本的に使用していることに気付きました。私はコードをリファクタリングし、ほとんどのコードを修正しました。私が現在直面している問題は、私の検索方法を使用することです。いくつかのコレクションでは、検索メソッドが整数ID(Student Numberなど)を返し、他のコレクションでは文字列ID(例:コースコード)が返されました。私は、これらの両方のケースに対応できる単一のメソッドを作成する方法を理解しようとしています。C++ intまたはstring引数をとるメソッドのリファクタリング

私は本質的に以下のコードを必要としますが、それに渡される型(intまたはstring)を受け取って返します。 getID()は、学生クラスの学生IDまたはコースクラスのコースコードを返すために使用された単なるメソッドであることに注意してください。

template <typename S> 
S * findID([string or int] ID){ 
    for (typename vector<S*>::collectionsIter element = collection.begin() ; element != collection.end(); ++element) 
     if((*element)->getID() == ID) return *element; 
    return NULL; 
} 
+2

まず、あなたは別の機能は必要ありません - 述語/ファンクタ/ラムダとの 'のstd :: find_if'は、あなたが可能性でありますつかいます。 – PaulMcKenzie

答えて

0

あなたは、何かのようにテンプレートを使用することがあります。

template <typename Collection, typename ID> 
auto* find_by_id(Collection& collection, const ID& id) 
{ 
    auto it = std::find_if(std::begin(collection), std::end(collection), 
         [&](const auto* e) { return e->getID() == id; }) 
    if (it == std::end(collection)) { 
     return nullptr; 
    } 
    return *it; 
} 
関連する問題