我有一个名为“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++ 大师能帮我吗?谢谢。