Проверить компилируемость кода
От: _NN_ www.nemerleweb.com
Дата: 15.05.19 20:01
Оценка:
Есть ли в современном (C++17) способ проверить компилируемость кода и выбрать перегрузку в соответствии с этим ?
Например:
// Хотим узнать будет ли компилироваться этот код для T
template<typename T> void range_for(T const& t) { for(auto&& e : t) {} }

template<typename T, bool = false>
struct is_range_forable : std::false_type{};

template<typename T>
struct is_range_forable<T, __is_compiling__(  range_for(std::declval<T>()) )  : std::true_type{};


В C++20 Обещают лямбды в decltype и тогда задача должна решиться без пробем.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Проверить компилируемость кода
От: sergii.p  
Дата: 16.05.19 08:34
Оценка:
Здравствуйте, _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()? Как проверить наличие метода, писалось например тут
Re[2]: Проверить компилируемость кода
От: _NN_ www.nemerleweb.com
Дата: 16.05.19 08:42
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>а почему нельзя проверить тип T на наличие методов begin() и end()? Как проверить наличие метода, писалось например тут

Можно конечно, но хотелось бы общее решения для чего угодно.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Проверить компилируемость кода
От: σ  
Дата: 16.05.19 15:02
Оценка:
_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.
Re: Проверить компилируемость кода
От: kov_serg Россия  
Дата: 16.05.19 19:10
Оценка: +1 :)))
Здравствуйте, _NN_, Вы писали:

_NN>Есть ли в современном (C++17) способ проверить компилируемость кода и выбрать перегрузку в соответствии с этим ?

...
_NN>В C++20 Обещают лямбды в decltype и тогда задача должна решиться без пробем.
Какие-то полумеры. Надо что бы можно было прогнать тесты на производительность, выбрать контейнеры, алгоритмы, типы данных, их организацию, порядок выполнения и варианты распаралеливания причем всё на шаблонах и в compile time и только потом отправить код в облака для оценки производительности на разных процессорах и системах и на основе этих "bigdata" синтезировать код и собирать бинарники в сотни мегабайт на все возможные случаи
Зачем всё пихают в компилятор? Что мешает разбить фазы синтеза исходного кода и компиляцию?
Re[2]: Проверить компилируемость кода
От: _NN_ www.nemerleweb.com
Дата: 17.05.19 19:20
Оценка: :)
Здравствуйте, kov_serg, Вы писали:

_>Зачем всё пихают в компилятор? Что мешает разбить фазы синтеза исходного кода и компиляцию?

В некоторых языках это всё делается легко и непринуждённо.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Проверить компилируемость кода
От: kov_serg Россия  
Дата: 17.05.19 19:46
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, kov_serg, Вы писали:


_>>Зачем всё пихают в компилятор? Что мешает разбить фазы синтеза исходного кода и компиляцию?

_NN>В некоторых языках это всё делается легко и непринуждённо.
Никак руки не дойдут попробывать. Еще бы было это не привязано к .net
Re[4]: Проверить компилируемость кода
От: _NN_ www.nemerleweb.com
Дата: 20.05.19 06:12
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Здравствуйте, _NN_, Вы писали:


_NN>>Здравствуйте, kov_serg, Вы писали:


_>>>Зачем всё пихают в компилятор? Что мешает разбить фазы синтеза исходного кода и компиляцию?

_NN>>В некоторых языках это всё делается легко и непринуждённо.
_>Никак руки не дойдут попробывать. Еще бы было это не привязано к .net
Увы, боюсь это так и останется
Есть Scala и Rust с макросами, не знаю насколько они того же уровня.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Проверить компилируемость кода
От: Skorodum Россия  
Дата: 05.06.19 13:09
Оценка: :)
Здравствуйте, kov_serg, Вы писали:

_>Какие-то полумеры. Надо что бы можно было прогнать тесты на производительность, выбрать контейнеры, алгоритмы, типы данных, их организацию, порядок выполнения и варианты распаралеливания причем всё на шаблонах и в compile time и только потом отправить код в облака для оценки производительности на разных процессорах и системах и на основе этих "bigdata" синтезировать код и собирать бинарники в сотни мегабайт на все возможные случаи

Без блокчейна это все не серьезно
Re: requires идёт на помощь
От: _NN_ www.nemerleweb.com
Дата: 30.01.20 05:30
Оценка: 3 (2)
Здравствуйте, _NN_, Вы писали:

Итак, с помощью requires быль стала явью.

Проверяем, что нельзя вызвать m.monitor, а если можно то заваливаем компиляцию .

template <typename M>
constexpr bool can_monitor_rvalue = 
  requires(M m, Data d) { m.monitor(std::move(d)); };
 
static_assert(!can_monitor_rvalue<Machine>);
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: requires идёт на помощь
От: sergii.p  
Дата: 30.01.20 09:12
Оценка:
Здравствуйте, _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 не запишешь. Или я ошибаюсь?
Re[2]: Проверить компилируемость кода
От: T4r4sB Россия  
Дата: 30.01.20 09:21
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP> Как проверить наличие метода, писалось например тут


А что, добавить констекспровую функцию StructureHasMethod<typename T, const char *C> до сих пор не додумались?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: Проверить компилируемость кода
От: sergii.p  
Дата: 30.01.20 10:17
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, sergii.p, Вы писали:


SP>> Как проверить наличие метода, писалось например тут


TB>А что, добавить констекспровую функцию StructureHasMethod<typename T, const char *C> до сих пор не додумались?

const char* не может быть параметром шаблона. Ну и ниже по теме уже упомянули requires который элегантно решает задачу (но только в С++20)
Re[4]: Проверить компилируемость кода
От: T4r4sB Россия  
Дата: 30.01.20 12:09
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>const char* не может быть параметром шаблона. Ну и ниже по теме уже упомянули requires который элегантно решает задачу (но только в С++20)


А что в С++ есть в качестве констекспровых строк? Что, их тоже не завезли?!
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[5]: Проверить компилируемость кода
От: sergii.p  
Дата: 30.01.20 12:59
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>А что в С++ есть в качестве констекспровых строк? Что, их тоже не завезли?!


вопрос не в constexpr. Такой объект не сможет фигурировать в качестве значения в параметре шаблона. float не может, что уж говорить про другие типы.
Ну и другая проблема. Перевести текст строки в код (чтобы тот же sfinae заработал). Вроде такого варианта не существует.
Re[2]: requires идёт на помощь
От: σ  
Дата: 30.01.20 13:11
Оценка:
_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>


Так, а range for проверяется?
Re[6]: Проверить компилируемость кода
От: T4r4sB Россия  
Дата: 30.01.20 13:21
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>Ну и другая проблема. Перевести текст строки в код (чтобы тот же sfinae заработал). Вроде такого варианта не существует.


Ну, уж для констекспровых строк могли бы и запилить компильтаймовый евал.
А для проверки наличия поля евал не нужен.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: requires идёт на помощь
От: _NN_ www.nemerleweb.com
Дата: 30.01.20 15:37
Оценка:
Здравствуйте, σ, Вы писали:

σ>Так, а range for проверяется?


Тут можно посмотреть во что разворавивается https://en.cppreference.com/w/cpp/language/range-for

{

    init-statement
    auto && __range = range_expression ;
    auto __begin = begin_expr ;
    auto __end = end_expr ;
    for ( ; __begin != __end; ++__begin) {

        range_declaration = *__begin;
        loop_statement

    }

}


Ну и из этого построить концепт с комбинацией из https://en.cppreference.com/w/cpp/iterator#C.2B.2B20_iterator_concepts

Это всё можно сделать и в С++17, только немного с ADL заморочки: https://eao197.blogspot.com/2019/07/progc-sfinae.html
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: requires идёт на помощь
От: σ  
Дата: 30.01.20 16:45
Оценка:
Тогда что значит что быль стала явью?
Как произвольный код нельзя было проверить, так и до сих пор нельзя.
Re[5]: requires идёт на помощь
От: _NN_ www.nemerleweb.com
Дата: 01.02.20 14:20
Оценка:
Здравствуйте, σ, Вы писали:

σ>Тогда что значит что быль стала явью?

σ>Как произвольный код нельзя было проверить, так и

Выражения можно .

template <class T>
concept Semiregular = DefaultConstructible<T> &&
    CopyConstructible<T> && Destructible<T> && CopyAssignable<T> &&
requires(T a, size_t n) {  
    requires Same<T*, decltype(&a)>;  // nested: "Same<...> evaluates to true"
    { a.~T() } noexcept;  // compound: "a.~T()" is a valid expression that doesn't throw
    requires Same<T*, decltype(new T)>; // nested: "Same<...> evaluates to true"
    requires Same<T*, decltype(new T[n])>; // nested
    { delete new T };  // compound
    { delete new T[n] }; // compound
};


https://en.cppreference.com/w/cpp/language/constraints
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.