1

我想創建一個模糊控制器的跳轉表。基本上,我有很多的是採取一個字符串並返回一個浮動的功能,我想能夠沿線做一些事情:如何創建一個帶參數的成員函數指針數組?

float Defuzzify(std::string varName, DefuzzificationMethod defuzz) 
{ 
    return functions[defuzz](varName); 
} 

其中DefuzzificationMethod是一個枚舉。目標是避免一個switch語句並執行O(1)操作。

我有現在的問題是:

float CenterOfGravity(std::string varName); 

std::vector<std::function<float (std::string)>> defuzzifiers; 

然後我嘗試用初始化它在構造函數中:

defuzzifiers.reserve(NUMBER_OF_DEFUZZIFICATION_METHODS); 
defuzzifiers[DEFUZZ_COG] = std::bind(&CenterOfGravity, std::placeholders::_1); 

這使編譯器拋出約enable_if約100個錯誤(我不要在任何地方使用,所以我認爲std是)。有沒有辦法讓這個編譯?此外,是否有辦法使這個靜態向量,因爲每個模糊控制器將基本上具有相同的向量?提前

感謝

+0

請解釋正確的一個。做這項工作讓我瘋狂,因爲參考文獻很少。 –

回答

2

儲備只是確保有足夠的能力,它實際上並不麥向量的尺寸足夠大。你想要做的是:

// construct a vector of the correct size 
std::vector<std::function<float (std::string)>> defuzzifiers(NUMBER_OF_DEFUZZIFICATION_METHODS); 

// now assign into it... 
// if CentorOfGravity is a free function, just simple = works 
defuzzifiers[DEFUZZ_COG] = CenterOfGravity; 

// if it's a method 
defuzzifiers[DEFUZZ_COG] = std::bind(&ThisType::CenterOfGravity, this, std::placeholders::_1); 

現在,這可能會讓你一些系統漏洞實際上並沒有一個函數定義的,所以也許你要提供各種各樣的默認功能,它在矢量構造函數允許太

std::vector<std::function<float (std::string)>> defuzzifiers(
    NUMBER_OF_DEFUZZIFICATION_METHODS, 
    [](std::string x) { return 0f; } 
); 

一個不相關的註釋,你可能希望你的函數通過const-ref而不是按值來獲取字符串,因爲複製字符串非常昂貴。

+0

CentorOfGravity是一個成員函數,所以會讓事情變得更加困難。其他所有東西都很有意義(特別是通過const ref傳遞字符串),但我仍然得到100多個錯誤。 –

+0

@BrunoAyllon加入瞭如何做到這一點 – Barry

+1

它完美的工作,非常感謝你。你太棒了。希望我有代表投票解決方案(相當新的SO)。 –