И еще раз про строки в параметрах шаблона.
От: s_viy  
Дата: 01.09.11 22:02
Оценка: 18 (1)
Я использую такой прием для передачи строк в шаблоны, может кому-то полезно будет:


template<typename N>
class foo
{
public:
  const char* get_name() const { return N()(); }
};

#define NAME(N) struct n_##N{ const char* operator()() const { return #N; } };

#include <iostream>

NAME(myname)

int main()
{
  foo<n_myname> f;
  std::cout << f.get_name() << std::endl;
  return 0;
}


строки передаю в основном для именования сущностей —
для этого простой макрос NAME(name) генерит следующий код:


struct n_name
{
  const char* operator()() const
  {
    return "name";
  }
};


Префикс n_ для удобства восприятия

Аналогично более универсальный макрос

#define STRING(N, S) struct N{ const char* operator()() const { return S; } };


Заметил, что многие программисты избегают напрямую возвращать "строки", вопрос почему? или я чего-то не догоняю?
Re: И еще раз про строки в параметрах шаблона.
От: Sni4ok  
Дата: 02.09.11 06:05
Оценка:
Здравствуйте, s_viy, Вы писали:

_>Я использую такой прием для передачи строк в шаблоны, может кому-то полезно будет:


и как вы к примеру будете вычислять длину строки на этапе компиляции?
Re: И еще раз про строки в параметрах шаблона.
От: Chorkov Россия  
Дата: 02.09.11 08:31
Оценка: +2
Здравствуйте, s_viy, Вы писали:

_>Заметил, что многие программисты избегают напрямую возвращать "строки", вопрос почему? или я чего-то не догоняю?


Просто, даже если сейчас функция возвращает исключительно стоки "зашитые" в исходник, со времнем наверняка потребуется возвращать строки определнные в run-time.
Сарзу возникают вопросы: нужно ли вызывть для char* delete[]/free/ничего? Если владельцем возвращнной строки остается объект ее вернувший, как долго будет жить эта строка? ...
Вобщем, мильён вопросов, пусть и простых, но зачем оставлять столько мест для ошибки?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.