Есть ли какой-нибудь класс, служащий оберткой для строковых литералов.
Что-нибудь в духе
std::string s="Hello";
f(s.c_str(),s.size());
Только в первой строке произойдет копирование в буфер. Хотелось бы этого по возможности избежать. А во второй избежать вызова strlen или совсем, или хотя бы многократного.
Если есть 2 класса, один из которых, скажем ограничивает интерфейс только константными методами, а второй копирует в буфер только по необходимости, то совсем замечательно было бы.
L>Только в первой строке произойдет копирование в буфер. Хотелось бы этого по возможности избежать. А во второй избежать вызова strlen или совсем, или хотя бы многократного.
L>Если есть 2 класса, один из которых, скажем ограничивает интерфейс только константными методами, а второй копирует в буфер только по необходимости, то совсем замечательно было бы.
void f (const char* ptr, int sz) {}
template<int N>
void f(const char (&arr)[N])
{
return f(arr, N-1);
}
int main()
{
f("Hello");
return 0;
}
L>Так это к каждой функции нужно писать обертку. Хотя явно лучше варианта MShura. А всё таки легковесного класса нет?
как вариант:
template<typename T, int len>
int str_len_ct(const T (&)[len])
{
return len-1;
}
int main(int argc, const char * argv[])
{
int len = str_len_ct("Hello");
int len2 = str_len_ct(L"unicode");
}
class constStr {
public:
template<int N>
constStr( const char (&str)[N] ) : ptr( str ), count( N ) {}
operator const char*() const { return ptr; };
int size() const { return count; }
// тут добавь интерфейса по вкусу...private:
char const * const ptr;
const int count;
};
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, lifrsdn, Вы писали:
L>Только в первой строке произойдет копирование в буфер. Хотелось бы этого по возможности избежать. А во второй избежать вызова strlen или совсем, или хотя бы многократного.
L>Если есть 2 класса, один из которых, скажем ограничивает интерфейс только константными методами, а второй копирует в буфер только по необходимости, то совсем замечательно было бы.
Может имеет смысл посмотреть в сторону const_string ?
[RSDN@Home 1.2.0 alpha rev. 775 on Windows XP 5.1.2600.131072]
"В любое мгновение принятия решения, лучшее, что вы можете сделать, это принять правильное решение; следующим лучшим вариантом будет принять неправильное решение, худший вариант – не принимать решения совсем" (c) Теодор Рузвельт.
L>И более-менее стандартного при этом нет?
Имхо нет, да и работать это будет только со статически константными строками, определенными в этом же модуле.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Bell, Вы писали: А>error C2784: 'size_t arr_size(const T [t_n])' : could not deduce template argument for 'const T [t_n]' from 'int [12]' А>(VS2005)
А>?
Потому, что f( T t[] ), f( T t[12] ) и f( T* const t ) эквивалентны. Так что вывести длину массива действительно никак не получится.
Хинт: как передавать массив по значению собираешься?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: Compile-time strlen
От:
Аноним
Дата:
29.11.07 19:49
Оценка:
Здравствуйте, Erop, Вы писали:
E>Потому, что f( T t[] ), f( T t[12] ) и f( T* const t ) эквивалентны. Так что вывести длину массива действительно никак не получится. E>Хинт: как передавать массив по значению собираешься?
Во блин. Прикольный язык, ИМХО его невозможно выучить до конца — пока выучишь, новый стандарт приймут
Я знал, что f( T t[] ) эквивалентно f( T* const t ),
но как-то не подумал что f( T t[X] ) == f( T t[Y] ) == f( T t[] ) == f( T* const t ).
Спасибо.
L>Только в первой строке произойдет копирование в буфер. Хотелось бы этого по возможности избежать. А во второй избежать вызова strlen или совсем, или хотя бы многократного.
L>Если есть 2 класса, один из которых, скажем ограничивает интерфейс только константными методами, а второй копирует в буфер только по необходимости, то совсем замечательно было бы.
Насчет копирование решается просто: Boost.Range (Поиск по форуму помогает )