Я использую такой прием для передачи строк в шаблоны, может кому-то полезно будет:
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; } };
Заметил, что многие программисты избегают напрямую возвращать "строки", вопрос почему? или я чего-то не догоняю?