Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> способ применения User-defined Literals? 
V
    Опции темы
boostcoder
Дата 9.11.2011, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем снова доброго дня.
недавно, в GCC были реализованы User-defined Literals, и я за одно решил собрать mingw на основе trunk версии исходников. для "просветиться", так сказать.

в стандарте и гугле выловил несколько примеров, и закодил такое:
Код


#include <iostream>

long double operator"" _degrees(long double d) { return d * 0.0175; }
const char* operator"" _func1(const char* name, size_t) { return name; }

int main() {
   std::cout << 180_degrees << std::endl;
   std::cout << "function"_func1 << std::endl;
}

все работает. вывод:
Цитата

-3.65375e+046
function

далее, увидел в стандарте такую форму записи:
Цитата

2 If L is a user-defined-integer-literal, let n be the literal without its ud-suffix. 
   If S contains a literal operator with parameter type unsigned long long, the 
   literal L is treated as a call of the form
      operator "" X(nULL)
   Otherwise, S shall contain a raw literal operator or a literal operator 
   template (13.5.8 over.literal), but not both. If S contains a raw literal 
   operator the literal L is treated as a call of the form
      operator "" X("n")
   Otherwise (S contains a literal operator template), L is treated as a call of the form
      operator "" X<'c1', 'c2', … , 'ck'>()
   where n is the source character sequence c1c2…ck. 
  [Note: The sequence c1c2…ck can only contain characters from the basic source character set. —end note]


и попробовал записать это так:
Код

template<char... chars>
int operator"" _var_string() { return sizeof...(chars); }

но получаю такую ошибку:
Цитата

error: unable to find valid user-defined string literal operator 'operator"" _var_string'.
Possible missing length argument in string literal operator.

аргументы подставлять пробовал. методом тыка. по всякому.
что я не правильно делаю? или может быть реализация еще не полная.

полный код:
Код


#include <iostream>

long double operator"" _degrees(long double d) { return d * 0.0175; }
const char* operator"" _func1(const char* name, size_t) { return name; }
template<char... chars>
constexpr int operator"" _var_string() { return sizeof...(chars); }

int main() {
   std::cout << 180_degrees << std::endl;
   std::cout << "function"_func1 << std::endl;
   std::cout << "some string"_var_string << std::endl;
}


это первый вопрос.


второй вопрос - что с этим делать, и как применять?
третий - какого типа являются объекты/переменные(?) _degrees/_func1/_var_string ?

спасибо.

Добавлено через 4 минуты и 34 секунды
Цитата(boostcoder @  9.11.2011,  13:32 Найти цитируемый пост)
template<char... chars>
int operator"" _var_string() { return sizeof...(chars); }

кстати на вики приводится такой же пример: http://en.wikipedia.org/wiki/C%2B%2B11#User-defined_literals

Это сообщение отредактировал(а) boostcoder - 9.11.2011, 13:36
PM WWW   Вверх
bsa
Дата 9.11.2011, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



На сколько я понял написанное в описании этой фичи, тебе необходимо добавить параметр в литерал _var_string...

кстати, а что значит "char..."?
PM   Вверх
boostcoder
Дата 9.11.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(bsa @  9.11.2011,  13:42 Найти цитируемый пост)
тебе необходимо добавить параметр в литерал _var_string

чего я только туда не добавлял smile 

Цитата(bsa @  9.11.2011,  13:42 Найти цитируемый пост)
кстати, а что значит "char..."?

variadic template состоящий из переменного кол-ва чаров.

PM WWW   Вверх
newbee
Дата 9.11.2011, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Это ужас. Такими стараниями еще чуть-чуть и они доведут С++ по уровню write-only до перла. Вот эти литералы, &&-ссылки (в следующем стандарте уже предусмотрели что-нибудь для &&&?), нагромождения в темплейтах, синтаксически ужасные лямбды... Все это очень печально.

В голове вертится мысль, что эти литералы можно как-то использовать в мета-программировании, но пока без конкретики.


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 9.11.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



 smile 
Цитата(newbee @  9.11.2011,  13:49 Найти цитируемый пост)
синтаксически ужасные лямбды

лямбды очень даже юзабильные.

Цитата(newbee @  9.11.2011,  13:49 Найти цитируемый пост)
можно как-то использовать в мета-программировании

это одно из применений. вот только хочется понять всю идею.
PM WWW   Вверх
newbee
Дата 9.11.2011, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(boostcoder @  9.11.2011,  14:52 Найти цитируемый пост)
лямбды очень даже юзабильные.
Они полностью выбиваются из синтаксиса С++ (того, уже старого С++). ну вот пример из википедии:
Код
[](int x, int y) -> int { int z = x + y; return z; }
Что за помесь бульдога с носорогом с++ и хаскеля? Это конечно лучше тех позорных недолямбд из буста, но все равно фу!

Код
auto outlist = filter(inlist, [](int x){return x>5;}); // это никуда не годится
auto outlist = filter(inlist, (x){return x>5}); // например так было бы куда удачней с т.з. сохранения синтаксиса языка
Опять же, дополнительные модификаторы типов параметров в []-начале лямбды, что за идиотизм? Нужно было приделывать внутри ()-параметров к каждому аргументу.


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 9.11.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(newbee @  9.11.2011,  14:09 Найти цитируемый пост)
Опять же, дополнительные модификаторы типов параметров в []-начале лямбды, что за идиотизм? Нужно было приделывать внутри ()-параметров к каждому аргументу.

прошу прощения за прямоту, но ты совершенно не в теме.
внутри квадратных скобок размещается список захвата переменных в текущем скопе. и к аргументам он не имеет никакого отношения.

Это сообщение отредактировал(а) boostcoder - 9.11.2011, 14:35
PM WWW   Вверх
newbee
Дата 9.11.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(boostcoder @  9.11.2011,  15:28 Найти цитируемый пост)
внутри квадратных скобок размещается список захвата переменных в текущем скопе, и выше. и к аргументам он не имеет никакого отношения. 
Кхм, так это "настройка" замыкания. Точно не в теме smile Но это же не нужно. Все "внешние" переменные, использованные в лямбде, должны автоматически замыкаться с доступом на чтение/запись. Совершенно лишние усложнения.


--------------------
You're face to face
With man who sold the world
PM   Вверх
bsa
Дата 9.11.2011, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(newbee @  9.11.2011,  15:42 Найти цитируемый пост)
Совершенно лишние усложнения. 
согласен
PM   Вверх
mes
Дата 9.11.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(newbee @  9.11.2011,  13:42 Найти цитируемый пост)
 Все "внешние" переменные, 

они могут быть захвачены, как по ссылке,так и по значению.. без подсказки компилятор не знает как в конткретном случае поступать..


Цитата(newbee @  9.11.2011,  13:09 Найти цитируемый пост)
но все равно фу!

синтаксис да фу, но их теперешнее наличие  smile 

и да это оффтопик.. 


Это сообщение отредактировал(а) mes - 9.11.2011, 17:13


--------------------
PM MAIL WWW   Вверх
newbee
Дата 9.11.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(mes @  9.11.2011,  18:13 Найти цитируемый пост)
они могут быть захвачены, как по ссылке,так и по значению.. без подсказки компилятор не знает как в конткретном случае поступать..
Достаточно всегда захватывать по ссылке. Есть ли смысл захватывать по значению? То есть каждый раз копировать исходный объект, правильно? Просто я много пишу кода с замыканиями, и ни разу не приходило в голову, что может понадобиться семантика с копированием замкнутого объекта.


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 9.11.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(newbee @  9.11.2011,  17:56 Найти цитируемый пост)
Есть ли смысл захватывать по значению?

банально - существование функционального объекта инкрементирует счетчик ссылок.

Добавлено через 37 секунд
похоже, что делать с сабжем, никто не знает...
PM WWW   Вверх
newbee
Дата 9.11.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(boostcoder @  9.11.2011,  19:06 Найти цитируемый пост)
банально - существование функционального объекта инкрементирует счетчик ссылок.
А если теперь по-русски, пожалуйста? Имеется в виду, что внутри лямбды инкрементируется замкнутая переменная? Но это же замыкание по ссылке, а не по значению... Я руководствуюсь тем, как это называется в случае аргументов функций: по ссылке - пришел int &x, по значению - пришел int x. Или тут все по-другому называется, и я опять не в теме?:(


--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 9.11.2011, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



newbee, функтор может быть вызван не в контексте его создания, а гораздо позже.. 



--------------------
PM MAIL WWW   Вверх
mes
Дата 9.11.2011, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  9.11.2011,  17:06 Найти цитируемый пост)
похоже, что делать с сабжем, никто не знает...

насколько я понимаю, возвращаемый тип может быть любым ?


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1119 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.