Специализация шаблонов сложными типами
От: SaZ  
Дата: 27.06.11 15:41
Оценка:
Возможно ли в С++ создать конструкцию вроде следующей?

template < const char * const T >
class Token {};

Token< "%something%" > token;


Подскажите, как лучше сделать такой велосипед или лучше пересмотреть всю конструкцию? Пишется класс для того, чтобы генерировать некоторые строки по заданному шаблону.
Re: Специализация шаблонов сложными типами
От: Erop Россия  
Дата: 27.06.11 15:53
Оценка: +1
Здравствуйте, SaZ, Вы писали:

SaZ>
SaZ>template < const char * const T >
SaZ>class Token {};

SaZ>Token< "%something%" > token;
SaZ>


SaZ>Подскажите, как лучше сделать такой велосипед или лучше пересмотреть всю конструкцию? Пишется класс для того, чтобы генерировать некоторые строки по заданному шаблону.



В С++, во всяком случае пока, нельзя параметризовывать шаблон указателем на объект со внутренним связыванием.
Так что ничего не выйдет.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Специализация шаблонов сложными типами
От: SaZ  
Дата: 27.06.11 16:03
Оценка:
Пока остановился на следующем варианте, он удовлетворяет моим потребностям:

template < const char * T >
class Token
{
  void Foo();
};

char DateTime[] = "%datetime%";

template <>
Token< DateTime >::Foo()
{
  // TODO
}
Re: Специализация шаблонов сложными типами
От: YuriV  
Дата: 27.06.11 16:52
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Возможно ли в С++ создать конструкцию вроде следующей?


SaZ>
SaZ>template < const char * const T >
SaZ>class Token {};

SaZ>Token< "%something%" > token;
SaZ>


SaZ>Подскажите, как лучше сделать такой велосипед или лучше пересмотреть всю конструкцию? Пишется класс для того, чтобы генерировать некоторые строки по заданному шаблону.


Только вот так:

template < const char * T >
class Token
{
public:
    Token() : _p(T) {}
    void Foo();
private:
    char const* _p;
};

char DateTime[] = "%datetime%";

template <const char * T>
void Token<T>::Foo()
{
    // TODO
}

int _tmain(int argc, _TCHAR* argv[])
{
    Token<DateTime> token;
    token.Foo();
    return 0;
}
Re[2]: Специализация шаблонов сложными типами
От: SaZ  
Дата: 27.06.11 17:14
Оценка:
Здравствуйте, YuriV, Вы писали:

YV>Только вот так:


Да, именно так и было сделано.
Re[2]: Специализация шаблонов сложными типами
От: Alexey F  
Дата: 27.06.11 17:28
Оценка:
Здравствуйте, YuriV, Вы писали:

YV>Только вот так:


YV>template < const char * T >
[...]
YV>    Token() : _p(T) {}
YV>    char const* _p;
[...]

YV>template <const char * T>
YV>void Token<T>::Foo()
YV>{
YV>    // TODO
YV>}
YV>


А зачем выделенное, если во всём классе есть доступ к строке через параметр шаблона T?
Re[3]: Специализация шаблонов сложными типами
От: YuriV  
Дата: 27.06.11 18:05
Оценка: +1
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, YuriV, Вы писали:


YV>>Только вот так:


AF>
YV>>template < const char * T >
AF>[...]
YV>>    Token() : _p(T) {}
YV>>    char const* _p;
AF>[...]

YV>>template <const char * T>
YV>>void Token<T>::Foo()
YV>>{
YV>>    // TODO
YV>>}
YV>>


AF> А зачем выделенное, если во всём классе есть доступ к строке через параметр шаблона T?

В общем не нужно конечно, забыл убрать...
Re[2]: Специализация шаблонов сложными типами
От: Abyx Россия  
Дата: 27.06.11 19:53
Оценка:
Здравствуйте, SaZ, Вы писали:

SaZ>Пока остановился на следующем варианте, он удовлетворяет моим потребностям:


SaZ>
SaZ>template < const char * T >
SaZ>class Token
SaZ>{
SaZ>  void Foo();
SaZ>};

SaZ>char DateTime[] = "%datetime%";

SaZ>template <>
SaZ>Token< DateTime >::Foo()
SaZ>{
SaZ>  // TODO
SaZ>}

SaZ>


если не нужна мутабельность строки, то лучше
extern const char DateTime[] = "%datetime%";
In Zen We Trust
Re[4]: Специализация шаблонов сложными типами
От: SaZ  
Дата: 28.06.11 09:28
Оценка:
Здравствуйте, YuriV, Вы писали:

YV>Здравствуйте, Alexey F, Вы писали:

AF>>
YV>>>    Token() : _p(T) {}
YV>>>

AF>> А зачем выделенное, если во всём классе есть доступ к строке через параметр шаблона T?
YV>В общем не нужно конечно, забыл убрать...

Я к QString привожу, так что мне нужно
Re[3]: Специализация шаблонов сложными типами
От: SaZ  
Дата: 28.06.11 09:33
Оценка:
Здравствуйте, Abyx, Вы писали:

A>если не нужна мутабельность строки, то лучше

A>
A>extern const char DateTime[] = "%datetime%";
A>


extern вынес в заголовочный файл, объявление и инициализацию в .cpp файл.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.