template<string>
От: Зверёк Харьковский  
Дата: 07.02.04 03:40
Оценка:
Господа, возможен ли сабж?
в смысле:
template<char*>f();
//или так:
template<std::string>f();

//c тем, чтобы потом сделать:
f<"some_string">();


есть ли какая хитрость, чтобы такого добиться?
FAQ — це мiй ай-кью!
Re: template<string>
От: c-smile Канада http://terrainformatica.com
Дата: 07.02.04 03:50
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>есть ли какая хитрость, чтобы такого добиться?


Хитрости никакой:
 typedef const char * cpchar;
 template<cpchar V>f()
{
  printf(V);
}


Основная хитрость что это не работает в VC++ 6.0 , бага хроническая.
Re: template<string>
От: MaximE Великобритания  
Дата: 07.02.04 06:11
Оценка: 5 (1)
Зверёк Харьковский wrote:

> Господа, возможен ли сабж?

> в смысле:
>
[]
> f<"some_string">();
>

>

В стандартном так С++ нельзя. Нетиповым параметром шаблона может быть сущность с external linkage. Строковой литерал linkage не имеет (если грубо, то можно рассматривать его как r-value).

> есть ли какая хитрость, чтобы такого добиться?


Можно попробовать так:

template<char const*>
struct some {};

// анонимный namespace для того, чтобы сущность не была доступна из других модулей
namespace {

// extern для того, чтобы сделать константе external linkage (для констант он internal по-умолчанию)
extern char const me[] = "me";

}

some<me> s;


--
Maxim Egorushkin
MetaCommunications Engineering
http://www.meta-comm.com/engineering/
Posted via RSDN NNTP Server 1.8 beta
Re[2]: template<string>
От: c-smile Канада http://terrainformatica.com
Дата: 07.02.04 06:33
Оценка:
Здравствуйте, MaximE, Вы писали:

Да, действительно.
Макс, спасибо за науку!

В качестве корявого варианта...

const char * msg[] = {
  "Hello World!\n",
  "Hello Universe!\n"
};

template<unsigned int V>f()
{
  printf(msg[V]);
}

int main(int argc, char* argv[])
{
  f<0>();
  f<1>();
  return 0;
}


Только VC++ 6.0 напечатает

Hello Universe!
Hello Universe!


Re[3]: template<string>
От: Павел Кузнецов  
Дата: 09.02.04 09:29
Оценка:
Здравствуйте, c-smile, Вы писали:

c>
 c> const char * msg[] = {
 c>   "Hello World!\n",
 c>   "Hello Universe!\n"
 c> };


template<typename T, T v>
struct Value2Type
{
};


 c> template<unsigned int V>f(Value2Type<unsigned int, V> = Value2Type<unsigned int, V>())
 c> {
 c>   printf(msg[V]);
 c> }

 c> int main(int argc, char* argv[])
 c> {
 c>   f<0>();
 c>   f<1>();
 c>   return 0;
 c> }
 c>


c> Только VC++ 6.0 напечатает <...>


Исправь, как выделено — и будет все в порядке.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: template<string>
От: Lorenzo_LAMAS  
Дата: 09.02.04 09:41
Оценка:
ПК>Исправь, как выделено — и будет все в порядке.

Что — то мне кажется, что не будет.
Of course, the code must be complete enough to compile and link.
Re[5]: template<string>
От: Павел Кузнецов  
Дата: 09.02.04 09:54
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

ПК>> Исправь, как выделено — и будет все в порядке.


LL> Что — то мне кажется, что не будет.


На VC6? Почему? Для нормальных компиляторов еще надо будет добавить возвращаемое
значение f (правда, по-моему, у c-smile не в этом вопрос был). Что-то еще?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: template<string>
От: Lorenzo_LAMAS  
Дата: 09.02.04 09:57
Оценка:
ПК>На VC6? Почему? Для нормальных компиляторов еще надо будет добавить возвращаемое
ПК>значение f (правда, по-моему, у c-smile не в этом вопрос был). Что-то еще?

Нет, я только про возвращаемое значение.
Of course, the code must be complete enough to compile and link.
Re[7]: template<string>
От: Павел Кузнецов  
Дата: 09.02.04 10:10
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

ПК>> На VC6? Почему? Для нормальных компиляторов еще надо будет добавить

ПК>> возвращаемое значение f (правда, по-моему, у c-smile не в этом вопрос был).
ПК>> Что-то еще?

LL> Нет, я только про возвращаемое значение.


Забавно, но Comeau C++ 4.3.3 исходный пример (с возвращаемым значением) не
откомпилировал. Упрощенная версия:
template<typename T, T v>
struct Value2Type
{
};

template<unsigned int V>
void foo(Value2Type<unsigned int, V> v = Value2Type<unsigned int, V>())
{
}

int main(int argc, char* argv[])
{
  foo<0u>();
}

F:\test>como test.cpp
Comeau C/C++ 4.3.3 (Oct 25 2003 12:02:26) for MS_WINDOWS_x86
Copyright 1988-2003 Comeau Computing.  All rights reserved.
MODE:strict warnings C++

"test.cpp", line 13: error: template instantiation resulted in unexpected
          function type of "void (Value2Type<unsigned int, 0U>)" (the meaning
          of a name may have changed since the template declaration -- the
          type of the template is "void (Value2Type<unsigned int, V>)")
    foo<0u>();
             ^
          detected during instantiation of "foo" based on template argument
                    <0U> at line 13

1 error detected in the compilation of "test.cpp".


Если убрать первый аргумент шаблона Value2Type — ест без возражений:
template<unsigned int v>
struct Value2Type
{
};

template<unsigned int V>
void foo(Value2Type<V> v = Value2Type<V>())
{
}

int main(int argc, char* argv[])
{
  foo<0u>();
}

Вот такие пироги... Пошел писать ноту в support
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[8]: template<string>
От: Lorenzo_LAMAS  
Дата: 09.02.04 10:22
Оценка:
даааааа, и на старуху комо бывает проруха!
Of course, the code must be complete enough to compile and link.
Re[2]: template<string>
От: Кодт Россия  
Дата: 09.02.04 10:26
Оценка: 1 (1)
Здравствуйте, MaximE, Вы писали:

ME>В стандартном так С++ нельзя. Нетиповым параметром шаблона может быть сущность с external linkage. Строковой литерал linkage не имеет (если грубо, то можно рассматривать его как r-value).


Нетиповым параметром может быть либо число°, либо указатель на сущность с external linkage.
Строковый литерал имеет internal linkage (это как бы static const char literal[] = "....").

° это к вопросу об rvalue
Перекуём баги на фичи!
Re[8]: template<string>
От: Lorenzo_LAMAS  
Дата: 09.02.04 11:02
Оценка:
По-моему, все еще хуже — если плюнуть на аргумент по умолчанию, предоставить свой агрумент функции, надеясь на дедусинг , то комо не видит подходящей функции — однажды такое уже тут обсуждалось (правда в несколько другом случае) тогда что-то так и не пришли к выводу, глюк это или нет. Т.е. получается, что в комо такую функцию вообще не вызвать никак.
Of course, the code must be complete enough to compile and link.
Re[3]: template<string>
От: MaximE Великобритания  
Дата: 09.02.04 18:11
Оценка:
Кодт wrote:

> ME>В стандартном так С++ нельзя. Нетиповым параметром шаблона может быть сущность с external linkage. Строковой литерал linkage не имеет (если грубо, то можно рассматривать его как r-value).

>

> Нетиповым параметром может быть либо число°, либо указатель на сущность с external linkage.

> Строковый литерал имеет internal linkage (это как бы static const char literal[] = "....").
>
> ° это к вопросу об rvalue

Да, прогнал немного:

5.1.2 A literal is a primary expression. Its type depends on its form (2.13). A string literal is an lvalue; all other literals are rvalues.

...

14.3.2.2 Note: A string literal (2.13.4) is not an acceptable template argument because a string literal is an object with internal linkage.


Сбило с толку меня это: http://groups.google.com/groups?&amp;lr=&amp;ie=UTF-8&amp;oe=utf-8&amp;selm=86adqqq8y4.fsf%40alex.gabi-soft.de&amp;rnum=5

--
Maxim Egorushkin
MetaCommunications Engineering
http://www.meta-comm.com/engineering/
Posted via RSDN NNTP Server 1.8 beta
Re[3]: template<string>
От: MaximE Великобритания  
Дата: 09.02.04 18:14
Оценка:
c-smile wrote:

[]

> Только VC++ 6.0 напечатает


Массивы замечательно индексируются run-time значениями. Зачем тебе здесь понадобилась compile-time constant?

--
Maxim Egorushkin
MetaCommunications Engineering
http://www.meta-comm.com/engineering/
Posted via RSDN NNTP Server 1.8 beta
Re[4]: template<string>
От: c-smile Канада http://terrainformatica.com
Дата: 10.02.04 01:03
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>c-smile wrote:


ME>Массивы замечательно индексируются run-time значениями. Зачем тебе здесь понадобилась compile-time constant?


В данном контексте мне оно не нужно.

Я когда-то для себя писал функции

template <dword MASK> bool getbit(dword v)
template <dword MASK> void setbit(dword v, bool on)

ну дык они не пошли...
Re[4]: template<string>
От: Зверёк Харьковский  
Дата: 10.02.04 21:33
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>c-smile wrote:


ME>[]


>> Только VC++ 6.0 напечатает


ME>Массивы замечательно индексируются run-time значениями. Зачем тебе здесь понадобилась compile-time constant?


изначально я всю эту суету затеял, а не c-smile
идея была вот в чем: имитировать таким хитрым образом проперти
ну то есть есть два класса, интерфес с точки зрения компилятора у них одинаковый, но у одного есть, скажем, a.property<"size">(), а у другого — b.property<"name">().
отличие от варианта a.property("size"), b.property("name") — в том, что при попытке сделать b.property<"size">() можно выдать compile-time ошибку
Подозреваю за собой очередной велосипед, но — см. в подпись .
FAQ — це мiй ай-кью!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.