我有一个叫做“ 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 ++专家可以帮我吗?谢谢。
最佳答案
您可能希望将其实现为纯虚拟方法。
class ValueChecker
{
public:
virtual bool checkMe(std::ostringstream& oss) = 0;
};
class Airplane : public ValueChecker
{
public:
virtual bool checkMe(std::ostringstream& oss);
};
这样,您只需调用
plane.checkMe(oss)
,就会调用飞机的checkMe-Method。关于c++ - 一种将派生类型传递给基本成员模板函数的优雅方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13801859/