3

我知道模板的重点是概括您的代码,但是我希望该类的一个特定成员函数根据创建的对象类型做出不同的反应。具体来说,我创建了一个类字典,用于创建 DictionaryNoun 或 DictionaryAdjective 对象。我有一个 Dictionary::print() 我想要一个代码结构如下:

Dictionary::print(){
   if(this is a Dictionary<Noun> object){
       // Print my nouns in some special way
   }
   if(this is a Dictionary<Adjective> object){
       // Print my adjectives in some special way
   }
   else{ //Print objects in default way}
}

我的问题是如何对我的对象进行类型检查?

4

3 回答 3

5

C++ 允许您专门针对特定模板参数的成员函数。例如,如果你有这样的事情:

template <typename T> class Dictionary {
    /* ... */
};

然后你可以通过写作来专门化printa 的作用Dictionary<Noun>

template <>
    void Dictionary<Noun>::print() {
    /* ... special code for printing nouns ... */
}

你可以专攻Adjective相同的方式。最后,您可以编写一个默认实现,如果两者都不匹配,则通过编写

template <typename T>
    void Dictionary<T>::print() {
    /* ... catch-all code ... */
}

希望这可以帮助!

于 2012-08-16T22:34:46.213 回答
2

Noun虽然您可以使用专业化来处理这个问题,但我相信如果您在元素 ( , )中实现实际打印而不是这样设计会更好,Adjective然后Dictionary<T>::print遍历容器调用适当的重载/成员函数。

void print( std::ostream& o, Noun const & n );
void print( std::ostream& o, Adjective const & a );
// Alternatively
// void Noun::print( std::ostream& );
// void Adjective::print( std::ostream& );

template <typename T>
void Dictionary<T>::print( std::ostream& o ) {
   // iterate over all elements:
   for ( T const& r : container ) {
      print( o, r );
      // alternatively: r.print(o);
   }
}
于 2012-08-16T23:40:10.450 回答
1

您不需要用于函数(或方法)重载的模板。

void print(std::ostream &os, const Noun &v) {}
void print(std::ostream &os, const Adjective &v) {}

尽管您需要一个模板作为全部内容。

template<typename T>
  void print(std::stream &os, const T &v) {}
于 2012-08-16T22:47:24.663 回答