2016-05-07 1 views
-1

Я хочу создать следующий метод элемента для класса Fibonacci im, который работает для класса C++ im im, но я хочу, чтобы он работал для строк и длин без необходимости писать два отдельных метода.Как заставить компилятор использовать правильный перегруженный метод в C++ для шаблонного класса

Я написал шаблонную функцию, но компилятор не смог проверить оператор if, поэтому он всегда говорил, что может использовать std::to_string() в строковом типе, и компилятор завершится с ошибкой.

Так что я должен был сделать два метода для решения шпагатом и тоскует

 template <typename T> 
     void fib<T>::next_ele(){ 
      if(typeid(a_) == typeid(long(0))){ 
       std::cout<<typeid(a_).name(); 
       T nextp = a_ + b_; 
       seq_+=","; 
       seq_+=std::to_string(nextp); 
       a_ = b_; 
       b_ = nextp;  
      } 
      else{ 
       T nexte = b_ + a_; 
       seq_+=","; 
       seq_+=nexte; 
       a_ = b_; 
       b_ = nexte; 
      } 

     } 

Основная программа

 #include "fibclass.h" 
     #include <typeinfo> 
     #include <string> 
     using std::string; 
     #include <iostream> 
     using std::cout; using std::endl; 

     int main(){ 

      cus::fib<long> a; 
      cout<<a<<endl; 
      for(int i = 1; i<=5; i++){ 
       a.next_ele(4); 
      } 

      cout<<a<<endl; 
      cus::fib<string> b("a","b"); 
      for(int i = 1; i<=6; i++){ 
       b.next_ele("p"); 
     } 
      cout<<b; 
     } 

заголовок с двумя различными способами в основном работу вокруг

 #ifndef FIBH 
     #define FIBH 

     #include <string> 
     using std::string; 
     #include <typeinfo> 
     #include <iostream> 
     namespace cus{ 
      template <typename T> 
      class fib{ 
       private: 

       public: 
        string seq_; 
        T a_; 
        T b_; 
        fib() : seq_("0,1") , a_(long(0)), b_(long(1)){}; 
        fib(T a, T b) : seq_(""), a_(a), b_(b) {}; 
        void next_ele(long); 
        void next_ele(string); 
        friend std::ostream& operator<<(std::ostream& out,fib& f){ 
       out<<f.seq_; 
       return out; 
      }; 


      }; 

     template <typename T> 
     void fib<T>::next_ele(long b){ 
      long nextp = a_ + b_; 
      seq_+=","; 
      seq_+=std::to_string(nextp); 
      a_ = b_; 
      b_ = nextp; 
     } 
     template <typename T> 
     void fib<T>::next_ele(string a){ 
       string nexte = b_ + a_; 
       if (!(seq_.empty())) 
        seq_+=","; 
       seq_+=nexte; 
       a_ = b_; 
       b_ = nexte; 
      } 

     } 

     #endif 
+0

Google для «шаблонной специализации». В любом случае, вы будете писать разные методы. – selbie

+0

Хорошо, как бы я отформатировал методы, чтобы узнать, следует ли вызывать метод long или метод string для вашей помощи. –

+0

Я думаю, что у меня есть решение для вас, но понимаете ли вы, что инструкция 'T nexte = b_ + a_; 'будет просто конкатенировать строки вместе и не на самом деле« ничего добавить »? Результатом будет постоянно растущая строка нулей и единиц. (например, '1010110101101101'), а не что-либо, что представляет собой серию Фибоначчи. Если это то, что вы хотите, я поделюсь своим решением. – selbie

ответ

0

Да: проблема - это функция std::to_string(). Это существует для long, но не подходит для std::string.

И std::to_string() скомпилирован, даже если T является std::string (также если эта часть кода не выполнена).

Если вы действительно хотите один метод (но ... что случилось с специализацией) ... Я полагаю, вы можете использовать std::ostringstream, который работает с целыми числами и строками, вместо std::to_string(); что-то вроде

template <typename T> 
    void fib<T>::next_ele(){ 

     std::cout << "typename is [" << typeid(a_).name() << "]\n"; 

     std::ostringstream oss; 

     T nextpe = (typeid(a_) == typeid(long(0)) ? a_ + b_ : b_ + a_); 

     oss << ',' << nextpe; 

     seq_ += oss.str(); 
     a_ = b_; 
     b_ = nextpe; 
    } 

p.s.1: Если вы используете std::ostringstream, не забудьте включить <sstream>.

p.s.2: Извините за мой плохой английский.

+0

Спасибо! это ответ, который я искал –

Смежные вопросы