template<typename T> в строку
От: Чили Россия  
Дата: 09.02.07 06:43
Оценка:
Подскажите пожалуйста, как реализовать следующую шаблонную функцию на чистом С++ (без STL)
template<typename T>
char* ArgToStr(const T& t, char *str)
{
  // выполнить что то типа sprintf(str,t)
}
Re: template<typename T> в строку
От: ncode  
Дата: 09.02.07 06:55
Оценка:
Здравствуйте, Чили, Вы писали:

Ч>Подскажите пожалуйста, как реализовать следующую шаблонную функцию на чистом С++ (без STL)

Ч>
Ч>template<typename T>
Ч>char* ArgToStr(const T& t, char *str)
Ч>{
Ч>  // выполнить что то типа sprintf(str,t)
Ч>}
Ч>

У меня такая процедура есть в коде:
#ifdef _DEBUG
template <typename T> void DebugPrint(LPCTSTR str, T t)
{
    LPTSTR buf = new TCHAR[::_tcslen(str) + 16];
    ::_stprintf(buf, str, t);
    ::OutputDebugString(buf);
    delete [] buf;
}

Коряво, знаю, но для отладочной версии хватает.
Re: template<typename T> в строку
От: Аноним  
Дата: 09.02.07 07:17
Оценка:
Здравствуйте, Чили, Вы писали:

Ч>Подскажите пожалуйста, как реализовать следующую шаблонную функцию на чистом С++ (без STL)

А использовать STL почему нельзя? Тебе придется создать полный аналог потоков

template<typename T>
char* ArgToStr(const T& t, char *str, size_t strMaxLen/*Мы же не хотим хипу покалечить?*/);
/*
{
  // выполнить что то типа sprintf(str,t)
}
*/

template<>
char* ArgToStr<int>(const T& t, char *str, size_t strMaxLen)
{
// и рисовать такую специализацию для КАЖДОГО типа
}
Re[2]: template<typename T> в строку
От: Аноним  
Дата: 09.02.07 07:28
Оценка:
Здравствуйте, ncode, Вы писали:

N>У меня такая процедура есть в коде:

N>
N>#ifdef _DEBUG
N>template <typename T> void DebugPrint(LPCTSTR str, T t)
N>{
N>    LPTSTR buf = new TCHAR[::_tcslen(str) + 16];
N>    ::_stprintf(buf, str, t);
N>    ::OutputDebugString(buf);
N>    delete [] buf;
N>}
N>

N>Коряво, знаю, но для отладочной версии хватает.


std::string x("sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss");
DebugPrint( "%s", x.c_str() );

Re[2]: template<typename T> в строку
От: Чили Россия  
Дата: 09.02.07 07:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А использовать STL почему нельзя? Тебе придется создать полный аналог потоков

Можно и с использованием STL. Тогда вообще проблем нет! Но тогда придется объяснять что такое STL!
А>char* ArgToStr(const T& t, char *str, size_t strMaxLen/*Мы же не хотим хипу покалечить?*/);
VS2005 приучил?
А>template<>
А>char* ArgToStr<int>(const T& t, char *str, size_t strMaxLen)
А>{
А>// и рисовать такую специализацию для КАЖДОГО типа
А>}
А>

Придется реализовывать для каждого типа!
Re[3]: template<typename T> в строку
От: Аноним  
Дата: 09.02.07 07:44
Оценка:
Здравствуйте, Чили, Вы писали:

А>>А использовать STL почему нельзя? Тебе придется создать полный аналог потоков

Ч>Можно и с использованием STL. Тогда вообще проблем нет! Но тогда придется объяснять что такое STL!
Смотри книгу Джосьютиса. В твоем конкретном случае std::ostringstream сделает всю работу
Re: template<typename T> в строку
От: ArtDenis Россия  
Дата: 09.02.07 09:27
Оценка:
Чили wrote:
> Подскажите пожалуйста, как реализовать следующую шаблонную функцию на
> чистом С++ (без STL)...

Хе-хе
#include <stdio.h>
#include <boost/type_traits.hpp>

template<typename T> char* ArgToStr(T t, char *str)
{
    sprintf
    (
        str,
        boost::is_floating_point<T>::value ? "%f" :
        boost::is_integral<T>::value ? "%i" : "s",
        t
    );

    return str;
}

int main()
{
    char buffer[10];

    ArgToStr(1, buffer);
    ArgToStr(0.21, buffer);
}


Posted via RSDN NNTP Server 2.0
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: template<typename T> в строку
От: krevetca  
Дата: 09.02.07 11:31
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Чили wrote:

>> Подскажите пожалуйста, как реализовать следующую шаблонную функцию на
>> чистом С++ (без STL)...

AD>Хе-хе

AD>
AD>#include <stdio.h>
AD>#include <boost/type_traits.hpp>

AD>template<typename T> char* ArgToStr(T t, char *str)
AD>{
AD>    sprintf
AD>    (
AD>        str,
AD>        boost::is_floating_point<T>::value ? "%f" :
AD>        boost::is_integral<T>::value ? "%i" : "s",
AD>        t
AD>    );

AD>    return str;
AD>}

AD>


AD>


Если использовать boost, то проще :


#include <boost/lexical_cast.hpp>
#include <string>

int main()
{
    int i = 10;
    boost::lexical_cast< std::string >( 10 );
}
Re: template<typename T> в строку
От: Кодт Россия  
Дата: 09.02.07 13:29
Оценка:
Здравствуйте, Чили, Вы писали:

Ч>Подскажите пожалуйста, как реализовать следующую шаблонную функцию на чистом С++ (без STL)


Сперва реализуй без STL какую-нибудь простую строку. У которой есть оператор приведения к const char*
class scoped_str
{
    char* data;

public:
    explicit scoped_str(int n) : data(new char[n+1]) { data[0]=0; }
    scoped_str(const scoped_str& s) : data(new char[strlen(s)+1]) { strcpy(data,s); }
    ~scoped_str() { delete[] data; }

private: // не Assignable
    scoped_str& operator=(const scoped_str& s);

public:
    operator char*() { return data; }
    operator const char*() const { return data; }
};


И возвращай её на здоровье
template<class T> scoped_str to_str(const char* fmt, T v)
{
    const int ENOUGH = 255;
    scoped_str buf(ENOUGH);
    sprintf(buf, fmt, v);
    return buf;
}
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.