2012-11-16 63 views
2

我想將functors存儲在stl map中,然後逐個調用它,但現在確定如何調用它。這是我到目前爲止所嘗試的。在一個stl地圖中存儲函數並調用它們

#include <iostream> 
#include <map> 
#include <string> 

class BaseFunctor { 
public: 
    BaseFunctor() { 
    } 
    ~BaseFunctor() { 
    } 
}; 

template <typename T> 
class MyFunctor : public BaseFunctor { 
    public: 
    T operator()(T x) { 
     return x * 2; 
    } 
}; 

int main (int argc, char**argv) { 
    std::map<std::string, BaseFunctor*> m_functorMap; 

    m_functorMap.insert(std::make_pair("int", new MyFunctor<int>())); 
    m_functorMap.insert(std::make_pair("double", new MyFunctor<double>())); 
    m_functorMap.insert(std::make_pair("float", new MyFunctor<float>())); 
    m_functorMap.insert(std::make_pair("long", new MyFunctor<long>())); 

    for (std::map<std::string, BaseFunctor*>::iterator itr = m_functorMap.begin(); itr != m_functorMap.end(); ++itr) { 
    std::cout << *(itr->second)() << std::endl; 
    } 


    return 0; 
} 

我不能使用boost

+0

什麼不工作? –

+0

有沒有一個原因,你說博士與邪惡引語'函子? –

+0

運算符優先級需要'(* itr-> second)()'。 –

回答

4

你有地圖充滿BaseFunctor*,但BaseFunctor不贖回,因爲它沒有operator()。如果不投射到派生類型的指針,則不能調用,最好使用dynamic_cast。總的來說,它看起來不是一個好的設計。您正試圖在無法運行時使用運行時多態。

+1

當這個問題得到解決時,他會遇到問題,因爲'operator()'比'operator *'更緊密,因此'*(itr-> second)()'會先調用然後解除引用,但它應該是另一種方式。 –

相關問題