std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 07:54
Оценка:
Возник такой вопрос, есть допустим у меня фунция:
void SetError(str::string stError)
{
    m_stError = stError;
    ...
    ...
}

Пользую я её так
SetError("my errror");
// или так
std::string st;
st = "Ошибка в файле: ";
st += FILE_NAME;
SetError(st);

Так вот как мне можно "уменьшить" второй вариант использования, т.е. что-нить типа
SetError(new std::string("Ошибка в файле: " + FILE_NAME));

Такое вообще возможно?
Re: std::string создать "динамически"
От: Bell Россия  
Дата: 23.03.06 07:57
Оценка: +1
Здравствуйте, Аноним, Вы писали:

SetError(std::string("Ошибка в файле: ") + FILE_NAME);
Любите книгу — источник знаний (с) М.Горький
Re[2]: std::string создать "динамически"
От: Bell Россия  
Дата: 23.03.06 07:59
Оценка: +1
Здравствуйте, Bell, Вы писали:

Да, и вот еще что: лучше переделать SetError вот так:

void SetError(const str::string& stError)
Любите книгу — источник знаний (с) М.Горький
Re: std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 08:01
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Такое вообще возможно?


Да в общем нет проблем создать объект динамически.
Такой вот код работает на ура
  std::string *pStr = new std::string("this is the test string");
  delete pStr;

Что тебя смущает?
Нужно ли это в твоем случае — это другой вопрос.
Re[2]: std::string создать "динамически"
От: rg45 СССР  
Дата: 23.03.06 08:17
Оценка:
" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1799773@news.rsdn.ru...
>
>  std::string *pStr = new std::string("this is the test string");
>  delete pStr;
>


По-моему, ты упускаешь из виду, что сам по себе std::string — малюсенькая структурка. В этой структурке никакого текста нет, а есть указатели на текст, для которого она при необходимости сама выделяет память, и сама же ее освобождает. Другими словами std::string для того и существует, чтобы избавить пользователя от выделения и освобождения памяти, поэтому такое его использование, как приводишь ты выглядит странно.
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 08:45
Оценка:
Здравствуйте, rg45, Вы писали:


R>" Аноним " <0@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:1799773@news.rsdn.ru...

>>
>>  std::string *pStr = new std::string("this is the test string");
>>  delete pStr;
>>


R>По-моему, ты упускаешь из виду, что сам по себе std::string — малюсенькая структурка. В этой структурке никакого текста нет, а есть указатели на текст, для которого она при необходимости сама выделяет память, и сама же ее освобождает. Другими словами std::string для того и существует, чтобы избавить пользователя от выделения и освобождения памяти, поэтому такое его использование, как приводишь ты выглядит странно.


Ничего я не упускаю
Я просто сказал, что технически это можно.
Нужно ли — это совсем другой вопрос.
Re[4]: std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 09:02
Оценка:
Спасибо за ответы!
А можно как-нить так сделать?
SetError(std::string("Число: ") + 777);
Re[5]: std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 09:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо за ответы!

А>А можно как-нить так сделать?
А>
А>SetError(std::string("Число: ") + 777);
А>


Можно и так, например, с помощью буста.
SetError(std::string("Число: ") + boost::lexical_cast<std::string>(777));


А в общем тебе подойдет любой способ конвертации числа в строку.
Их много...
Re[6]: std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 09:24
Оценка:
А>Их много...
Посоветуйте какой-нибудь кроме буста и такой чтобы можно было в одну строчку, т.к. _itoa тут не примениш...
Re[7]: std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 09:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>Их много...

А>Посоветуйте какой-нибудь кроме буста и такой чтобы можно было в одну строчку, т.к. _itoa тут не примениш...

Видимо проще будет сделать свою маленькую функцию-утилиту,
которая делает это хоть и с помощью _itoa
std::string ToStr(int val)
{
  return //...
}
Re[8]: std::string создать "динамически"
От: remark Россия http://www.1024cores.net/
Дата: 23.03.06 09:34
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>>Их много...

А>>Посоветуйте какой-нибудь кроме буста и такой чтобы можно было в одну строчку, т.к. _itoa тут не примениш...

А>Видимо проще будет сделать свою маленькую функцию-утилиту,

А>которая делает это хоть и с помощью _itoa
А>
А>std::string ToStr(int val)
А>{
А>  return //...
А>}
А>


... или просто скопировать код из boost'а это вроде как и без boost'а будет и вроде как думать не надо и правильно


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[8]: std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 09:45
Оценка:
А>Видимо проще будет сделать свою маленькую функцию-утилиту,
А>которая делает это хоть и с помощью _itoa
Посмотрите плз, такая функция нормальная с точки зрения всяких там размешений в памяти возвращаемых переменных, типа не надо там перед char ыефешс писать?
std::string IntToStr(int nValue)
{
    char str[10] = {0};
    _itoa(nValue, str, 10);
    return str;
}
Re[7]: std::string создать "динамически"
От: Вумудщзук Беларусь  
Дата: 23.03.06 09:45
Оценка: 4 (1) :)
>>Их много...
>Посоветуйте какой-нибудь кроме буста и такой чтобы можно было в одну строчку, т.к. _itoa тут не примениш...

#define TT(x) #x

...

std::string str = std::string("wow") + TT(777);


Homo sum et nihil humani a me alienum puto...
Re[7]: std::string создать "динамически"
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 23.03.06 09:46
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Посоветуйте какой-нибудь кроме буста и такой чтобы можно было в одну строчку, т.к. _itoa тут не примениш...


void test(const string& s) {
    cout << s << endl;
}

namespace std {
    string& operator+(string& s, int i) {
        ostringstream os(s);
        os.seekp(s.size(), ios_base::beg);
        os << i;
        s = os.str();
        return s;
    }
}

int main() {
    test(string("Number: ") + 777);
    return 0;
}
http://denis-zhdanov.blogspot.com
Re[8]: std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 09:48
Оценка:
Здравствуйте, Вумудщзук, Вы писали:

>>>Их много...

>>Посоветуйте какой-нибудь кроме буста и такой чтобы можно было в одну строчку, т.к. _itoa тут не примениш...

В>
В>#define TT(x) #x

В>...

В>std::string str = std::string("wow") + TT(777);
В>


В>

О мистика! То что надо!!!
Re[9]: std::string создать "динамически"
От: Аноним  
Дата: 23.03.06 09:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Вумудщзук, Вы писали:


В>>
В>>#define TT(x) #x

В>>...

В>>std::string str = std::string("wow") + TT(777);
В>>


В>>

А>О мистика! То что надо!!!

На всякий случай...
Это работает только с константами. Он не зря смайлик поставил
Вот это будет работать немного "странно"
int rc = 666;
std::string str = std::string("wow") + TT(rc)
Re[9]: std::string создать "динамически"
От: rg45 СССР  
Дата: 23.03.06 09:52
Оценка:
"Аноним" <0@users.rsdn.ru> wrote in message news:1800040@news.rsdn.ru...
> Здравствуйте, Вумудщзук, Вы писали:
>
> >>>Их много...
> >>Посоветуйте какой-нибудь кроме буста и такой чтобы можно было в одну строчку, т.к. _itoa тут не примениш...
>
> В>
> В>#define TT(x) #x
> 
> В>...
> 
> В>std::string str = std::string("wow") + TT(777);
> В>

>
> В>
> О мистика! То что надо!!!

Только имей ввиду, что это будет работать только с литералами.
Вот так результат будет уже не тот, что тебе нужно:
  const int tt = 777;
  std::string str = std::string("wow") + TT(tt);
Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re[9]: std::string создать "динамически"
От: ekamaloff Великобритания  
Дата: 23.03.06 09:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Посмотрите плз, такая функция нормальная с точки зрения всяких там размешений в памяти возвращаемых переменных, типа не надо там перед char ыефешс писать?

А>
А>std::string IntToStr(int nValue)
А>{
А>    char str[10] = {0};
А>    _itoa(nValue, str, 10);
А>    return str;
А>}
А>


Нормальная, только размера str не для всех int хватит (должно быть str[12] кажется). Инициализация str необязательна.

Кроме того, вместо этого можно заюзать stringstream.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[8]: std::string создать "динамически"
От: remark Россия http://www.1024cores.net/
Дата: 23.03.06 10:03
Оценка:
Здравствуйте, Вумудщзук, Вы писали:

>>>Их много...

>>Посоветуйте какой-нибудь кроме буста и такой чтобы можно было в одну строчку, т.к. _itoa тут не примениш...

В>
В>#define TT(x) #x

В>...

В>std::string str = std::string("wow") + TT(777);
В>


В>



А я могу ещё проще:

std::string str = std::string("wow") + "777";


Или даже ещё проще:

std::string str = "wow777";





1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Конкатенация строк и чисел в С++ одним выражением
От: astral_marine  
Дата: 23.03.06 10:21
Оценка:
#define _S(msg)   (((std::basic_ostringstream<TCHAR>&)(((std::basic_ostringstream<TCHAR>&)std::basic_ostringstream<TCHAR>()) << msg)).str())

#define _SA(msg)  (((std::basic_ostringstream<char>&)(((std::basic_ostringstream<char>&)std::basic_ostringstream<char>()) << msg)).str())
#define _SW(msg)  (((std::basic_ostringstream<wchar_t>&)(((std::basic_ostringstream<wchar_t>&)std::basic_ostringstream<wchar_t>()) << msg)).str())

float a = 1.1;
SetError(_S("Ошибка в файле: " << FILE_NAME << 12 << 12.16 << a));


Код работает в Visual C++ 6.0, 2003
В GCC можно делать так:
template <class charT>
class str_helper : public std::basic_ostringstream<charT> 
{
public:
    std::basic_ostringstream<charT> & getRef()
    {
        return *static_cast<std::basic_ostringstream<charT> *>(this);
    }
};

#define _S(msg) (((std::basic_ostringstream<TCHAR>*)&( str_helper<TCHAR>().getRef() << msg))->str())
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.