Информация об изменениях

Сообщение Re[40]: Портирование нитры. от 17.02.2017 5:38

Изменено 17.02.2017 5:39 alex_public

Re[40]: Портирование нитры.
Здравствуйте, novitk, Вы писали:

N>В плюсовых авто-лямбдах и шаблонах нет никакой статики. Для статики в плюсах нужно ждать концепты и оно имхо не масштабируется как типклассы, но тут я не уверен. Пусть alex_public примерчик на них перепишет, будем смотреть.


Да не будет там ничего интересного. Если взять скажем этот http://rsdn.org/forum/philosophy/6698765.1
Автор: alex_public
Дата: 14.02.17
примерчик, то с концептами он станет выглядеть как-нибудь так:
template<typename T> concept bool MyNum=requires(T a, T b) { {a+b}->T; {a/b}->T; };
//..
list<double> v={1.0, 2.0, 3.0}; //список
set<int> s={1, 2, 3, 3}; //множество
auto f=[](const MyNum& s, const MyNum& x) {return (s+x)/2;}; //MMA
cout<<accumulate(v.cbegin(), v.cend(), 0.0, f)<<' '<<accumulate(s.cbegin(), s.cend(), 0, f)<<endl; //выводит 2.125 2

что на мой взгляд не добавляет ни красоты, ни безопасности. Единственная разница будет в сообщениях об ошибках. Если мы попробуем вместо коллекции чисел использовать в таком коде коллекцию строк, то в первом варианте получим такое сообщение об ошибке:
error: no match for 'operator/' (operand types are 'std::__cxx11::basic_string<char>' and 'int')
  auto fll=[](const auto& s, const auto& x) {return (s+x)/2;}; //MMA
                                                    ~~~~~^~

а во втором варианте такое:
error: no matching function for call to 'main()::<lambda(const auto:9&, const auto:9&)>::operator()(const std::__cxx11::basic_string<char>&, const std::__cxx11::basic_string<char>&) const'
note: candidate: main()::<lambda(const auto:9&, const auto:9&)> [with auto:9 = std::__cxx11::basic_string<char>]
note:   constraints not satisfied
note: within 'template<class T> concept const bool MyNum<T> [with T = std::__cxx11::basic_string<char>]'
 template<typename T> concept bool MyNum=requires(T a, T b) { {a+b}->T; {a/b}->T; };
                                   ^~~~~
note:     with 'std::__cxx11::basic_string<char> a'
note:     with 'std::__cxx11::basic_string<char> b'
note: the required expression '(a / b)' would be ill-formed

И я бы не сказал, что второй вариант мне нравится сильно больше первого. )))
Re[40]: Портирование нитры.
Здравствуйте, novitk, Вы писали:

N>В плюсовых авто-лямбдах и шаблонах нет никакой статики. Для статики в плюсах нужно ждать концепты и оно имхо не масштабируется как типклассы, но тут я не уверен. Пусть alex_public примерчик на них перепишет, будем смотреть.


Да не будет там ничего интересного. Если взять скажем этот http://rsdn.org/forum/philosophy/6698765.1
Автор: alex_public
Дата: 14.02.17
примерчик, то с концептами он станет выглядеть как-нибудь так:
template<typename T> concept bool MyNum=requires(T a, T b) { {a+b}->T; {a/b}->T; };
//..
list<double> v={1.0, 2.0, 3.0}; //список
set<int> s={1, 2, 3, 3}; //множество
auto f=[](const MyNum& s, const MyNum& x) {return (s+x)/2;}; //MMA
cout<<accumulate(v.cbegin(), v.cend(), 0.0, f)<<' '<<accumulate(s.cbegin(), s.cend(), 0, f)<<endl; //выводит 2.125 2

что на мой взгляд не добавляет ни красоты, ни безопасности. Единственная разница будет в сообщениях об ошибках. Если мы попробуем вместо коллекции чисел использовать в таком коде коллекцию строк, то в первом варианте получим такое сообщение об ошибке:
error: no match for 'operator/' (operand types are 'std::__cxx11::basic_string<char>' and 'int')
  auto f=[](const auto& s, const auto& x) {return (s+x)/2;}; //MMA
                                                    ~~~~~^~

а во втором варианте такое:
error: no matching function for call to 'main()::<lambda(const auto:9&, const auto:9&)>::operator()(const std::__cxx11::basic_string<char>&, const std::__cxx11::basic_string<char>&) const'
note: candidate: main()::<lambda(const auto:9&, const auto:9&)> [with auto:9 = std::__cxx11::basic_string<char>]
note:   constraints not satisfied
note: within 'template<class T> concept const bool MyNum<T> [with T = std::__cxx11::basic_string<char>]'
 template<typename T> concept bool MyNum=requires(T a, T b) { {a+b}->T; {a/b}->T; };
                                   ^~~~~
note:     with 'std::__cxx11::basic_string<char> a'
note:     with 'std::__cxx11::basic_string<char> b'
note: the required expression '(a / b)' would be ill-formed

И я бы не сказал, что второй вариант мне нравится сильно больше первого. )))