Здравствуйте, _NN_, Вы писали:
_NN>Есть ли в современном (C++17) способ проверить компилируемость кода и выбрать перегрузку в соответствии с этим ? _NN>Например: _NN>[c] _NN>// Хотим узнать будет ли компилироваться этот код для T _NN>template<typename T> void range_for(T const& t) { for(auto&& e : t) {} }
а почему нельзя проверить тип T на наличие методов begin() и end()? Как проверить наличие метода, писалось например тут
Здравствуйте, sergii.p, Вы писали:
SP>а почему нельзя проверить тип T на наличие методов begin() и end()? Как проверить наличие метода, писалось например тут
Можно конечно, но хотелось бы общее решения для чего угодно.
_NN>В C++20 Обещают лямбды в decltype и тогда задача должна решиться без пробем.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0315r4.pdf#Item.5: > A concern with allowing lambda-expressions outside the body of the declaration of function templates is the need to evaluate the validity of potentially complex expressions as part of template argument deduction. Indeed, without clarifying the wording, it is unclear whether implementations would be expected to support SFINAE based on the validity of the body of a lambda-expression found in the declaration of a function template. Since this could be unwieldy for implementations, we choose not to require this in the current paper. Thus, if a lambda-expression appears inside the declaration of a function template and any part of it is ill-formed, then the program is ill-formed.
Здравствуйте, _NN_, Вы писали:
_NN>Есть ли в современном (C++17) способ проверить компилируемость кода и выбрать перегрузку в соответствии с этим ?
... _NN>В C++20 Обещают лямбды в decltype и тогда задача должна решиться без пробем.
Какие-то полумеры. Надо что бы можно было прогнать тесты на производительность, выбрать контейнеры, алгоритмы, типы данных, их организацию, порядок выполнения и варианты распаралеливания причем всё на шаблонах и в compile time и только потом отправить код в облака для оценки производительности на разных процессорах и системах и на основе этих "bigdata" синтезировать код и собирать бинарники в сотни мегабайт на все возможные случаи
Зачем всё пихают в компилятор? Что мешает разбить фазы синтеза исходного кода и компиляцию?
Здравствуйте, kov_serg, Вы писали:
_>Зачем всё пихают в компилятор? Что мешает разбить фазы синтеза исходного кода и компиляцию?
В некоторых языках это всё делается легко и непринуждённо.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, kov_serg, Вы писали:
_>>Зачем всё пихают в компилятор? Что мешает разбить фазы синтеза исходного кода и компиляцию? _NN>В некоторых языках это всё делается легко и непринуждённо.
Никак руки не дойдут попробывать. Еще бы было это не привязано к .net
Здравствуйте, kov_serg, Вы писали:
_>Здравствуйте, _NN_, Вы писали:
_NN>>Здравствуйте, kov_serg, Вы писали:
_>>>Зачем всё пихают в компилятор? Что мешает разбить фазы синтеза исходного кода и компиляцию? _NN>>В некоторых языках это всё делается легко и непринуждённо. _>Никак руки не дойдут попробывать. Еще бы было это не привязано к .net
Увы, боюсь это так и останется
Есть Scala и Rust с макросами, не знаю насколько они того же уровня.
Здравствуйте, kov_serg, Вы писали:
_>Какие-то полумеры. Надо что бы можно было прогнать тесты на производительность, выбрать контейнеры, алгоритмы, типы данных, их организацию, порядок выполнения и варианты распаралеливания причем всё на шаблонах и в compile time и только потом отправить код в облака для оценки производительности на разных процессорах и системах и на основе этих "bigdata" синтезировать код и собирать бинарники в сотни мегабайт на все возможные случаи
Без блокчейна это все не серьезно
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, _NN_, Вы писали:
_NN>Итак, с помощью requires быль стала явью.
_NN>Проверяем, что нельзя вызвать m.monitor, а если можно то заваливаем компиляцию .
_NN>
_NN>template <typename M>
_NN>constexpr bool can_monitor_rvalue =
_NN> requires(M m, Data d) { m.monitor(std::move(d)); };
_NN>static_assert(!can_monitor_rvalue<Machine>);
_NN>
я ещё не разбирался с requires но похоже, оно не добавило того, что нельзя было сделать в С++17. Точно такие же проверки на наличие метода, на возможность преобразования и т д. Просто вместо тонны кода появилось что-то красивое и масштабируемое. А более общего решения задачи так и нет. Тот же for в requires не запишешь. Или я ошибаюсь?
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, sergii.p, Вы писали:
SP>> Как проверить наличие метода, писалось например тут
TB>А что, добавить констекспровую функцию StructureHasMethod<typename T, const char *C> до сих пор не додумались?
const char* не может быть параметром шаблона. Ну и ниже по теме уже упомянули requires который элегантно решает задачу (но только в С++20)
Здравствуйте, sergii.p, Вы писали:
SP>const char* не может быть параметром шаблона. Ну и ниже по теме уже упомянули requires который элегантно решает задачу (но только в С++20)
А что в С++ есть в качестве констекспровых строк? Что, их тоже не завезли?!
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>А что в С++ есть в качестве констекспровых строк? Что, их тоже не завезли?!
вопрос не в constexpr. Такой объект не сможет фигурировать в качестве значения в параметре шаблона. float не может, что уж говорить про другие типы.
Ну и другая проблема. Перевести текст строки в код (чтобы тот же sfinae заработал). Вроде такого варианта не существует.
Здравствуйте, sergii.p, Вы писали:
SP>Ну и другая проблема. Перевести текст строки в код (чтобы тот же sfinae заработал). Вроде такого варианта не существует.
Ну, уж для констекспровых строк могли бы и запилить компильтаймовый евал.
А для проверки наличия поля евал не нужен.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте