「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++ の第一人者は私を助けてくれますか? ありがとう。