Berkus
хз
Dr. Friedrich
Удобный синтакс!
Berkus
но если можно перед void то можно и после чо уж
Berkus
[[attribute]] void [[attribute]] f() [[attribute]]; найдите функцию среди ее декларации
Dr. Friedrich
f() выдаёт тебя с головой.
Berkus
это просто атрибуты короткие
Dr. Friedrich
Лучше уж тогда [[attribute]] void [[attribute]] f [[attribute]] () [[attribute]];
Matway
Есть мнение, что в таком виде реализация контрактов только усугубит ситуацию. Все будут ставить contract-level=always и по двадцать раз платить за одну и ту же проверку.
Dr. Friedrich
И вот тут я реально уже начал теряться.
Berkus
void f(int x, int y)
[[expects: x>0]]
[[expects: y!=0]]
[[ensures result: result > x+y]];
примеры то подлиннее будут
Dr. Friedrich
Stanislav
Dr. Friedrich
🐙 Antony
Berkus
статическим анализом надо контракты гонять кек
🐙 Antony
Под то и задел
Matway
Dr. Friedrich
Dr. Friedrich
И писать всё на Java вместо C++, потому что «типа безопаснее»? 😂
Alexander "SonnySlave"
Berkus
Alexander "SonnySlave"
это же прекрасно
Dr. Friedrich
Alexander "SonnySlave"
Alexander "SonnySlave"
как там generic programming в Go? Multiple cursors?
Dr. Friedrich
🐙 Antony
[Note: An always contract-level is expected to be used for those contracts where the cost of run-time checking is assumed to be very small compared to the cost of executing the function and that should be checked regardless of the build mode. A default contract-level is expected to be used for those contracts where the cost of run-time checking is assumed to be small (or at least not expensive) compared to the cost of executing the function. An audit contract-level is expected to be used for those contracts where the cost of run-time checking is assumed to be large (or at least significant) compared to the cost of executing the function. An axiom contract-level is expected to be used for those contracts that are formal comments and are not evaluated at run-time. — end note]
Dr. Friedrich
Dr. Friedrich
Лучше, наоборот, выпилить чего-нибудь.
Matway
Berkus
Dr. Friedrich
Berkus
Olesya
не знаю, по адресу ли вопрос. при сборке opencv с cuda 8, nvcc 7.5, постоянно вылезает ошибка nvcc fatal : Unsupported gpu architecture 'compute_60'
Olesya
единственный раз, когда она не вылезла, это когда я из интереса поставила cuda generation = kepler
Olesya
но вообще то это неправильно, потому что у меня ge force 1050, а это поколение pascal
Olesya
вылезает на билде, cmake завершается успешно
Stanislav
CUDA 7.5 is not supporting pascal gpus.
Olesya
так у меня 8 куда
Olesya
nvcc 7,5
Stanislav
nvcc 7,5
чето фиг знает nvcc должен версию куды выдавать и должно быть 8.0
Dmitry
Интересно, почему std:: function не догоняет по функциональности лямбды? Нельзя mutable, только CopyConstructible...
Александр
Подскажите по логике. Хочу реализовать подобное: https://wandbox.org/permlink/TNeXmPKnkkXHEiWj
Задача - запилить базовый класс с определенным интерфейсом, который бы требовал от наследника реализации, скажем:
1) алиаса using data_t = ...;
2) функции void foobar(data_t&)
3) еще каких-нибудь алиасов и функций
чтобы всё это дело работало по CRTP и базовый интерфейс пользовался алиасами/функциями родителя. Алиасы, конечно, можно передавать в параметрах шаблона, а вот с функциями не прокатит.
Есть мысли?
Александр
Любопытно, что incomplete не возникает при использовании функций из Parent, однако std::is_detected на функции из Parent фолсит
Александр
https://wandbox.org/permlink/vkhaARzRnF248dZk
А вот здесь видно, что std::is_detected ломается. Код рабочий, но закомментированный static_assert фолсит и не даёт скомпилироваться. И это очень грустно
Dmitry
template<class Data>
void f(Data& d) {
static_assert(std::is_same<
Data, typename Parent::data_t>::value,
"parent Data type only accepted as f argument");
d++;
}
Александр
А требование на существование самой функции где?
Александр
Я не хочу разбираться в ошибках компиляции, что где-то там Parent::f() нельзя вызвать, я хочу static_assert
Александр
Сейчас начинаю подумывать о виртуальных функциях и передаче алиасов через шаблонные аргументы, но не вижу смысла в лишних косвенных вызовах
Dmitry
Можно написать has_function если есть сигнатура и имя функции наверное.
Dmitry
И завернуть его в static_cassert
Александр
Посмотри мою последнюю ссылку :)
Александр
Там std::is_detected во всей красе. Служит ровно для этого
Александр
Только нифига не работает
Dmitry
Тип ещё не определён, можно просто перенести в тело функции.
Александр
Хм, хорошая идея, только надо обдумать
Dmitry
Либо разделить данные с интерфейсом и испльзовать множественное наследование и в CRTP делать cast<Data😠cast<Parent😠this)).
Александр
Да интерфейс не хранит данные, а работает с ними
Dmitry
CRTP это скорее обобщённая реализация интерфейса.
Александр
Так здесь он идеально заходит, если бы не incomplete type
Dmitry
Но функции то инстанциируются в месте вызова, поэтому в них что угодно от родителя можно использовать.
Dmitry
Типы можно завернуть в отдельные traits ещё навреное....
Dmitry
template<class T> struct InterfaceTraits;
template <class Parent>
struct Interface {
using traits = InterfaceTraits<Parent>;
using data_t = typename traits::data_t;
void f(data_t& d) {
d++;
}
};
struct Foo;
template<> struct InterfaceTraits<Foo> {
using data_t = int;
};
struct Foo : Interface<Foo> {
};
Александр
Ну это ж извращение..
Александр
Всё-таки типы лучше передать через параметры шаблона
Александр
Но идея с переносом зависимости в отдельную шаблонную структура классная
Dmitry
Зависит от того сколько типов...
Dmitry
> Да интерфейс не хранит данные, а работает с ними
Это что, просто алгоритм? А зачем тут CRTP тогда?
Dmitry
template<class ImplDetail>
struct BasicAlgorithm {
using data_t = typename ImplDetail::data_t;
};
struct Foo {
using data_t = int;
};
using FooAlgorithm = BasicAlgorithm<Foo>;
Александр
Проблема в том, что сам интерфейс отнаследован от кое-чего важного и это что-то требуется и в интерфейсе, и в наследнике. Так что наследование отрубить нельзя
Dmitry
Значит, данные всё-таки есть?
Александр
Dmitry
Ну хорошо. Данные есть :)
Тгда таки да, просто отложить CRTP на один шаг.
template<class Target, class CommonBase>
struct Mixin {
using data_t = typename CommonBase::data_t;
};
struct FooBase { using data_t = int; };
struct Foo : FooBase, Mixin<Foo, FooBase> {};