2016-08-18 11 views
0

私の質問は、processを実行時に関数として呼び出す方法です。idマップを使用せずにですか?C++、テンプレートパラメータで関数を選択

#include <iostream> 
#include <map> 

enum id 
{ 
    id_1, 
    id_2, 
    id_3 
}; 

template <id id_> 
void process(); 

template<> 
void process<id_1>() 
{ 
    std::cout << "1" << std::endl; 
} 

template<> 
void process<id_2>() 
{ 
    std::cout << "2" << std::endl; 
} 

template<> 
void process<id_3>() 
{ 
    std::cout << "3" << std::endl; 
} 

std::map<id, void(*)()> mapping = 
{ 
    {id_1, process<id_1>}, 
    {id_2, process<id_2>}, 
    {id_3, process<id_3>} 
}; 

int main() 
{ 

    for (int i = 0; i < 10; ++i) 
    { 
     mapping[static_cast<id>(rand()%3)](); 
    } 

    return 0; 
} 
+2

これを行うには、何らかの種類のコンテナが必要であり、消去をタイプする必要があります。あなたの例のマップベースのアプローチは適切です –

+4

これにマップを使用すると何が問題になりますか? –

+1

提供されている解決策は私には大丈夫です。もう少し制約を設ける余裕があれば、 'map'の代わりに' array'や 'vector'を使うこともできます。 – Arunmu

答えて

2

mapエレガントなソリューションです。

mapを使用しない場合は、自分で関数呼び出しを 'マップ'する必要があります。今述べたコメントの一つとして

スイッチケース

void mapped_process(id id_) { 
    switch (id_) { 
    case id_1: 
     process<id_1>(); 
     break; 
    case id_2: 
     process<id_2>(); 
     break; 
    case id_3: 
     process<id_3>(); 
     break; 
    default: 
     break; 
    } 
} 

mapped_process(static_cast<id>(rand()%3); 

インデックスマップ

、あなたはいくつかの制約にmapを交換するarrayまたはvectorを使用することができます。列挙型には固有の値があります。

std::array<void(*)(), 3> procs = {process<id_1>, process<id_2>, process<id_3>}; 

procs[rand() % 3](); 
+0

ありがとうございます、私はマップがよりスムーズですが、スイッチケースよりも良い(コードは少ない)と思います。 –

関連する問題