從this question, which asks about SFINAE繼它給人的例子:使用SFINAE,如何避免「沒有名爲成員......」
template<class T>
std::string optionalToString(T* obj)
{
if (FUNCTION_EXISTS(T->toString))
return obj->toString();
else
return "toString not defined";
}
然而,如果一個對象不具備的,例如,一個toString ()函數,而不是在這種情況下返回「toString not defined」,即使我們可以檢測到函數是否存在,編譯器仍然會拋出一個錯誤,該對象沒有名爲「toString」的成員,然後突出顯示指向toString的指針。
我希望能夠做到對來自C++有不同的命名規則庫的對象相同的操作,例如:
if(R_Contains_SetPosition<TemplateObject>::Value)
{
TemplateObject->SetPosition(X,Y);
}
else if(R_Contains_setPosition<TemplateObject>::Value)
{
TemplateObject->setPosition(X,Y); //TemplateObject doesn't have a setPosition defined!
}
哪些代碼已經可以做到,但是編譯器會引發任何調用該對象沒有定義的函數的語句都會出錯。
是否有某種方式讓編譯器接受能夠調用成員函數(在此情況下不會運行)的代碼(通過重寫或修改編譯器標誌,最好是前者)反正),即使編譯器知道所說的成員函數不存在?
澄清:
這是不問如何檢測功能存在。我已經有這個能力。,這是問我如何編寫代碼,引用一個對象不一定會有沒有編譯器抱怨的功能?
系統是C++ 03,所以實驗性的C++ 14類似的解決方案在這裏將不會有效。
否。函數中的所有代碼都已實例化,並且必須對提供的類型有效。您必須使用sfinae和專業化來製作將始終適用於所有類型的函數。 boost :: hana的代碼使得它更容易,看起來更像你的建議,但它是sfinae上的語法糖。 – xaxxon
呃...這是不是你連接到自己的問題的完整重複?在發佈此問題之前,您是否閱讀過那些答案?我很想簡單地解決這個問題,但如果我錯過了一些東西,我會給你一個迴應的機會。 – hvd
因爲即使使用建議的函數檢查器,done - > toString也會拋出成員函數不存在的錯誤。我並不是問'如何檢查一個函數是否存在',我問'我如何愚弄編譯器不會讓我煩擾函數的不存在'。 – c1646091