2014-04-20 53 views
0

對於這個項目,我不能使用C++ 11,或者添加任何額外的依賴項(例如Boost)。pre-C++的std :: bind替代方案11

我試圖實現這一目標是:

typedef void (*processorFunction)(int numItems, std::string* items); 

class Files 
{ 
public: 
    Files() : m_KVSeparator('='), m_ListSeparator(',') {} 
    ~Files() {} 

    void ReadDataFile(std::string filename, std::map<std::string, processorFunction> processorFunctions); 

    char m_KVSeparator; 
    char m_ListSeparator; 
}; 

void Files::ReadDataFile(std::string filename, std::map<std::string, processorFunction> processorFunctions) 
{ 
    // The file parsing and choosing of the function omitted for brevity: 
    processorFunction processor = ...; 
    int numItems = ...; 
    std::string* items = ...; 

    processor(numItems, items); 
} 

// Example parser: 
void time_limit_parser(int& timeLimit, int numItems, std::string* items) 
{ 
    timeLimit = atoi(items[0].c_str()); 
} 

int main() 
{ 
    // Omitted getting the global file manager pointer 
    Files* files = ...; 
    std::map<std::string, processorFunction> configProcessorFunctions; 
    int timeLimit; 
    // ****** WHAT GOES HERE? ****** 
    files->ReadDataFile("config.dat", configProcessorFunctions); 
} 

我的問題是什麼我穿上****** WHAT GOES HERE? ******行?我會使用std :: bind來部分應用它(一個la time_limit_parser(timeLimit)),但我不能在這個項目中使用C++ 11。

+0

甚至在C++ 11之前,TR1已經提供了'std :: tr1 :: bind'。這對你有用嗎?如果沒有,那麼即使你不能添加對Boost的依賴,你也可以將Boost的實現複製到你自己的項目中。 – hvd

回答

1

因爲bind不會返回函數指針,所以即使使用bind,也無法做到您想要的操作。相反,您必須使用std::function模板來包裝它們。

事實證明,沒有什麼能夠阻止你完全做到這一點。

struct BaseProcessor 
{ 
    virtual void operator()(int numItems, std::string* items) = 0; 
}; 

struct TimeLimitParser : public BaseProcessor 
{ 
    int& timeLimit; 

    TimeLimitParser(int& limit) 
     : timeLimit(limit) 
    {} 

    virtual void operator()(int numItems, std::string* items) 
    { 
     time_limit_parser(timeLimit, numItems, items); 
    } 
}; 

int main() 
{ 
    // Omitted getting the global file manager pointer 
    Files* files = ...; 
    std::map<std::string, processorFunction*> configProcessorFunctions; 
    int timeLimit; 
    TimeLimitParser parser(timeLimit); 
    configProcessorFunctions["foo"] = &parser; 
    files->ReadDataFile("config.dat", configProcessorFunctions); 
} 

顯然,你需要改變的processFunction定義匹配的指針/參考BaseProcessor,這顯然並不像使用bind或lambda表達式漂亮,但如果你不能升級或獲得提振僅此就好像它會得到一些嚴肅的魔術。

+2

值得注意的是,你當然可以編寫這個模板版本,所以你只需要爲每個數量的參數編寫一個版本,而不是每個數量的一個版本乘以類型的排列。據我瞭解,這基本上是增強版本所做的。 – PeterT