
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 34 35 [36] 37 38 ... 77 78 ( Перейти к последнему сообщению ) |
Сообщ.
#526
,
|
|
|
Flex Ferrum, я думал об этом. Но иметь полиморфный вызов для сравнения - не по плюсовому как-то
![]() |
Сообщ.
#527
,
|
|
|
Цитата MyNameIsIgor @ Flex Ferrum, я думал об этом. Но иметь полиморфный вызов для сравнения - не по плюсовому как-то ![]() А иначе то - никак. По большому счёту. Хотя (по последней редакции стандарта) должно работать так: ![]() ![]() // При объявлении типа мапы: typedef std::multimap<int, A, bool (*)(A a1, A a2)> mmap_type; // при объявлении экземпляра мультимапы: mmap_type m([](A a1, A a2) {return a1.i < a2.i; }); Т. е. в случае, если лямбла идёт без capture-списка, то должна спокойно приводиться к указателю на функцию с соответствующей сигнатурой. |
Сообщ.
#528
,
|
|
|
Цитата Flex Ferrum @ А иначе то - никак. По большому счёту. А чем вариант с отдельным компаратором не устраивает? Цитата Flex Ferrum @ Т. е. в случае, если лямбла идёт без capture-списка, то должна спокойно приводиться к указателю на функцию с соответствующей сигнатурой. Но, опять же, на inline такого простейшего сравнения не приходится надеяться. |
Сообщ.
#529
,
|
|
|
Цитата MyNameIsIgor @ А чем вариант с отдельным компаратором не устраивает? Ну, это классика, которая уже перенесена в STL. Добавлено Цитата MyNameIsIgor @ Но, опять же, на inline такого простейшего сравнения не приходится надеяться. Да как сказать... Вполне может заинлайнить. |
Сообщ.
#530
,
|
|
|
Цитата Flex Ferrum @ Ну, это классика, которая уже перенесена в STL. В это же нет ничего плохого ![]() Цитата Flex Ferrum @ Да как сказать... Вполне может заинлайнить. Подумал... Да, может ![]() |
Сообщ.
#531
,
|
|
|
Цитата Flex Ferrum @ Хотя (по последней редакции стандарта) должно работать так: ![]() ![]() // При объявлении типа мапы: typedef std::multimap<int, A, bool (*)(A a1, A a2)> mmap_type; // при объявлении экземпляра мультимапы: mmap_type m([](A a1, A a2) {return a1.i < a2.i; }); Интересное своей краткостью решение, но компилятор к сожалению ругается. Код (lambda.h): ![]() ![]() #include <multimap.h> struct A { int i; }; class B { typedef std::multimap<A, int, bool (*)(A, A)> mmap_type; mmap_type m; B() : m([](A a1, A a2) {return a1.i < a2.i; }) { } }; И сама ошибка: ![]() ![]() lambda.h(13): error: no instance of constructor "std::multimap<_Key, _Tp, _Compare, _Alloc>::multimap [with _Key=A, _Tp=int, _Compare=bool (*)(A, A), _Alloc=std::allocator<std::pair<const A, int>>]" matches the argument list argument types are: (lambda [](A, A)->bool) B() : m([](A a1, A a2) {return a1.i < a2.i; }) { ^ compilation aborted for lambda.cpp (code 2) В случае приведения в строке 13 к mmap_type::key_compare получаем это: ![]() ![]() lambda.h(13): error: no suitable conversion function from "lambda [](A, A)->bool" to "bool (*)(A, A)" exists B() : m(mmap_type::key_compare([](A a1, A a2) {return a1.i < a2.i; }) ) { ^ compilation aborted for lambda.cpp (code 2) Получается, еще недореализовали стандарт в тестируемом мною компиляторе? |
Сообщ.
#532
,
|
|
|
Цитата ShapovalovTS @ Получается, еще недореализовали стандарт в тестируемом мною компиляторе? Такие изменения - только в последней редакции стандарта (конец марта 2010-го года). Очевидно, что ещё ни один компиль это не реализует. Да и не зафиксировано это ещё окончательно. |
Сообщ.
#533
,
|
|
|
Цитата Flex Ferrum @ последней редакции предложения. Его же еще не приняли? в последней редакции стандарта |
Сообщ.
#534
,
|
|
|
Цитата trainer @ последней редакции предложения. Его же еще не приняли? Ну, да. ![]() |
Сообщ.
#535
,
|
|
|
boost::variant? Проще некуда.
![]() ![]() ![]() template<int I, typename ... T> union variant_data; template<int I, typename T, typename ... Tail> union variant_data<I, T, Tail ...> { T m_data; variant_data<I + 1, Tail ...> m_tail; variant_data() {;} ~variant_data() {;} }; template<int I, typename T> union variant_data<I, T> { T m_data; variant_data() {;} ~variant_data() {;} }; template<typename ... T> struct variant { int m_dataIdx; variant_data<sizeof ... (T), T ...> m_variantData; }; |
Сообщ.
#536
,
|
|
|
Цитата Flex Ferrum @ Пока все идет к тому, что кроме концептов из стандарта ничего выкидывать не будут. Похоже, из C++0x могут удалить ни кем пока не реализованные фичи. User-defined literals Ref-qualifiers Inheriting constructors Работа комитета по стандартизации C++ радует всё больше и больше. Что правила C++ там толком не знают ([1][2][3]) я уже выяснил давно. Что некоторые члены комитета плохо владеют логикой и не пригодны для составления корректных формальных описаний выяснилось сравнительно недавно [1][2][3][4]. Теперь ещё нелепая мотивация добавления правил и удаления фич добавилась к послужному списку. Hint: D. Krugler, A. Williams и S. Clamage состоят в рабочих группах комитета по стандартизации C++. |
Сообщ.
#537
,
|
|
|
Цитата Masterkent @ Похоже, из C++0x могут удалить ни кем пока не реализованные фичи. User-defined literals Ref-qualifiers Inheriting constructors Ну, тут бабушка ещё на двое сказала. Это предложение только одной из стран (если я правильно понимаю аббревиатуру). С этим должны согласиться большинство, чтобы быть принятым. А переколбашивать драфт стандарта перед самым принятием - это жесть. |
Сообщ.
#538
,
|
|
|
Цитата Flex Ferrum @ А переколбашивать драфт стандарта перед самым принятием - это жесть. А когда состоится это самое принятие? Там по-любому ещё море исправлений надо внести - даже не считая те, которые пока не занесены в списки Core Language Active Issues и Library Active Issues. |
Сообщ.
#539
,
|
|
|
Цитата Masterkent @ А когда состоится это самое принятие? Ты намекаешь на то, что "никогда"? ![]() |
Сообщ.
#540
,
|
|
|
Цитата Flex Ferrum @ Ты намекаешь на то, что "никогда"? Скорее, на то, что новый стандарт или выйдет нескоро, или выйдет скоро, но в нём будет много-много дефектов (впрочем, их и в C++03 море). У меня всё никак руки не дойдут составить подробный отчёт о некоторых дефектах, о которых в комитете предположительно не знают, и отправить его в CWG. Пока я только время от времени создавал темы на comp.lang.c++.moderated и comp.std.c++. Лишь малую часть описанных мной проблем D. Krugler и D. Gregor направили на рассмотрение в CWG: 978, 1005, 1055, 1059, 1068, 1093. Первую проблему уже пофиксили, остальные пока рассматриваются или дожидаются рассмотрения. |