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