我有一个叫做“ 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/

10-11 22:42