2016-08-18 42 views
0

我的問題是如何通過運行時已知的id函數調用其中一個process而不使用map?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

提供的解決方案對我來說很合適。如果你有足夠的空間來放置一些約束,你甚至可以使用'array'或'vector'來代替'map' – Arunmu

回答

2

map是一個很好的解決方案。

如果你不想使用map,你必須自己映射函數調用。

的switch-case

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); 

地圖通過指數

正如提到的,你可以使用arrayvector一些約束,以取代map評論之一:枚舉具有獨特的價值。

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

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

謝謝,我認爲映射比switch-case更好(更少代碼),但速度更慢。 –