Зверёк Харьковский 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;
Здравствуйте, Lorenzo_LAMAS, Вы писали:
ПК>> Исправь, как выделено — и будет все в порядке.
LL> Что — то мне кажется, что не будет.
На VC6? Почему? Для нормальных компиляторов еще надо будет добавить возвращаемое
значение f (правда, по-моему, у c-smile не в этом вопрос был). Что-то еще?
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
ПК>На VC6? Почему? Для нормальных компиляторов еще надо будет добавить возвращаемое ПК>значение f (правда, по-моему, у c-smile не в этом вопрос был). Что-то еще?
Нет, я только про возвращаемое значение.
Of course, the code must be complete enough to compile and link.
Здравствуйте, 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"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, MaximE, Вы писали:
ME>В стандартном так С++ нельзя. Нетиповым параметром шаблона может быть сущность с external linkage. Строковой литерал linkage не имеет (если грубо, то можно рассматривать его как r-value).
Нетиповым параметром может быть либо число°, либо указатель на сущность с external linkage.
Строковый литерал имеет internal linkage (это как бы static const char literal[] = "....").
По-моему, все еще хуже — если плюнуть на аргумент по умолчанию, предоставить свой агрумент функции, надеясь на дедусинг , то комо не видит подходящей функции — однажды такое уже тут обсуждалось (правда в несколько другом случае) тогда что-то так и не пришли к выводу, глюк это или нет. Т.е. получается, что в комо такую функцию вообще не вызвать никак.
Of course, the code must be complete enough to compile and link.
Кодт 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.
Здравствуйте, 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 ошибку
Подозреваю за собой очередной велосипед, но — см. в подпись .