amfs
Abril 15, 2016, 2:04pm
#1
Como fazer o metodo addstr aceitar int e double com o uso dos metodos privados a seguir?
class Outstr{
private:
string out, pr[10], st[10];
int size, lmax;
string Str(int n){ // Converte inteiro para string
ostringstream ostr; // Output string stream
ostr << n;
return ostr.str();
}
string Str(double x, int d){ // Converte real para string, d decimais
ostringstream ostr; // Output string stream
ostr << fixed << setprecision(d) << x;
return ostr.str();
}
public:
Outstr() :out(""), size(0), lmax(0){};
void addstr(string prompt, string str){
pr[size] = prompt;
st[size] = str;
if (prompt.length()>lmax) lmax = prompt.length();
size++;
};
bem, eu não entendo suas necessidades exatas, este código parece fazer o que vc pretendia, mas como não entendi inteiramente a pergunta, espero que a resposta esteja correta.
//OutStr.h
#pragma once
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <type_traits>
using std::string;
using std::ostringstream;
using std::fixed;
using std::setprecision;
using std::is_arithmetic;
using std::is_integral;
using std::cout;
class Outstr
{
private:
string out, pr[10], st[10];
int size, lmax;
template<typename V, typename P>
string Str ( V value, P precision)
{
static_assert( is_arithmetic<V> ( ) && is_integral<P> ( ), "apenas numeros" );
if ( std::is_integral<V>() )
{
ostringstream stream;
stream << value;
return stream.str ( );
}
else
{
ostringstream stream;
stream << fixed << setprecision ( precision ) << value;
return stream.str ( );
}
}
public:
Outstr ( ) :out ( "" ), size ( 0 ), lmax ( 0 ) { };
template <typename PromptT, typename StringT>
void addstr ( PromptT prompt, StringT str, int precision = 0 )
{
string p = Str ( prompt, precision );
string s = Str ( str, precision );
addstr ( p, s );
}
void addstr ( string prompt, string str)
{
pr[size] = prompt;
st[size] = str;
if ( prompt.length ( ) > lmax )
lmax = prompt.length ( );
size++;
}