我有一個名爲類的ValueChecker'將派生類型傳遞給基礎成員模板函數的優雅方式?
其具有以下成員函數:
template<typename T>
bool ValueChecker::checkMe(std::ostringstream &oss, T &me) {
std::cout << "Default checkMe() for " << typeid(me).name() << std::endl;
return true;
}
類ValueChecker意圖做派生類的值有一些簡單的檢查。 checkMe()最終會得到專門爲不同的派生類:
class Airplane : public ValueChecker {
friend class ValueChecker;
[...]
}
template<>
bool ValueChecker::checkMe<Airplane>(std::ostringstream &oss, Airplane &me) {
...
/* Actually, this code is generated from a simple file which translates
* a simple language into C++ code. So that a non-developer can write
* the simple checks.
*
* ValueChecker itself has utility functions that may be called in the
* template specialization which are shared across all types.
*/
}
這工作,但只是一個小問題,checkMe的聲明,當你在調用:
int main() {
Airplane plane;
std::ostringstream oss;
if(plane.checkMe(oss, plane)) {
cout << "Values are bogus! " << oss.str() << endl;
return 0;
}
我調用plane.checkMe(oss,plane)。但是,我可以通過另一架飛機,而不是檢查飛機。此外,調用是多餘的?意思是,理論上,編譯器應該根據平面的類型知道調用哪個模板函數。不應該有必要將它作爲一個參數來傳遞?無論如何,最好不要消除最後一個論點。所以這樣的電話會很好:
if(plane.checkMe(oss)) { ... } // Calls the right template specialization.
我只是不能得到它的工作。 C++專家在這裏能幫助我嗎?謝謝。
我們不能在typeid中傳遞這個指針嗎? –
你評價過CRTP嗎?(http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) – Chubsdad
這首先看起來很奇怪。爲什麼'Airplane'派生自'ValueChecker'?爲什麼'checkMe()'當(從你的問題來判斷)它應該只檢查'this'的時候帶一個'T'類型的參數? – Angew