Сообщение Re[15]: Rust vs C++ 17 от 10.01.2016 5:38
Изменено 10.01.2016 5:43 red75
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, red75, Вы писали:
R>>>>Я где-то тут приводил темплейтно/макросный ужас, который нужен для более-вменяемого discriminated union.
EP>>>Готовый Boost.Variant есть уже больше 13 лет — бери и используй. Если хочется реализовать свой, то на C++14 он реализуется на порядки проще чем на C++98.
R>>Отсутствие прямой поддержки языком сложно компенсировать. Нормальный pattern-matching c case totality check библиотекой не сделаешь.
EP>Сделаешь. Pattern-matching по типам (то что нужно для Variant) есть в C++ начиная с C++98, totality check автоматом вытекает из свойств перегрузки.
EP>Лямбды для inplace-ности появились в C++11, да
Под нормальным паттерн-матчингом я имел в виду в том числе и destructuring. Вот, только что написал:
Это получение индексов и ссылок на мутабельные элементы массива без проверок границ массива. (idx, vref) деструктурирует tuple, возвращаемый enumerate().
Какое-то подобие деструктурирования tuple в C++ есть: std::tie() lvalue с использованием временных переменых, но более сложные случаи, вроде нижеприведенного, уже не обработаешь.
EDIT: Вставлю полный код. Параллельная обработка массива в несколько потоков:
EP>Здравствуйте, red75, Вы писали:
R>>>>Я где-то тут приводил темплейтно/макросный ужас, который нужен для более-вменяемого discriminated union.
EP>>>Готовый Boost.Variant есть уже больше 13 лет — бери и используй. Если хочется реализовать свой, то на C++14 он реализуется на порядки проще чем на C++98.
R>>Отсутствие прямой поддержки языком сложно компенсировать. Нормальный pattern-matching c case totality check библиотекой не сделаешь.
EP>Сделаешь. Pattern-matching по типам (то что нужно для Variant) есть в C++ начиная с C++98, totality check автоматом вытекает из свойств перегрузки.
EP>Лямбды для inplace-ности появились в C++11, да
Под нормальным паттерн-матчингом я имел в виду в том числе и destructuring. Вот, только что написал:
for (idx, vref) in chunk.iter_mut().enumerate() {
...
};Это получение индексов и ссылок на мутабельные элементы массива без проверок границ массива. (idx, vref) деструктурирует tuple, возвращаемый enumerate().
Какое-то подобие деструктурирования tuple в C++ есть: std::tie() lvalue с использованием временных переменых, но более сложные случаи, вроде нижеприведенного, уже не обработаешь.
match maybe_point {
Some(x,y) => {...},
None => {...},
}EDIT: Вставлю полный код. Параллельная обработка массива в несколько потоков:
crossbeam::scope(|scope| {
let chunk_len = (cubes.len()/thread_cnt as usize)+1;
for (ch_idx, chunk) in cubes[..].chunks_mut(chunk_len).enumerate() {
let start = ch_idx*chunk_len;
scope.spawn(move || {
for (idx, c) in chunk.iter_mut().enumerate() {
let cube = &self.cubes[start+idx];
c = CubeState {
pos: cube.pos + cube.spd * dt,
rot: Basis3::from_axis_angle(cube.rot_axe, Angle::from(deg(cube.rot_spd * dt))).concat(&cube.rot),
.. *cube
};
};
});
};
});Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, red75, Вы писали:
R>>>>Я где-то тут приводил темплейтно/макросный ужас, который нужен для более-вменяемого discriminated union.
EP>>>Готовый Boost.Variant есть уже больше 13 лет — бери и используй. Если хочется реализовать свой, то на C++14 он реализуется на порядки проще чем на C++98.
R>>Отсутствие прямой поддержки языком сложно компенсировать. Нормальный pattern-matching c case totality check библиотекой не сделаешь.
EP>Сделаешь. Pattern-matching по типам (то что нужно для Variant) есть в C++ начиная с C++98, totality check автоматом вытекает из свойств перегрузки.
EP>Лямбды для inplace-ности появились в C++11, да
Под нормальным паттерн-матчингом я имел в виду в том числе и destructuring. Вот, только что написал:
Это получение индексов и ссылок на мутабельные элементы массива без проверок границ массива. (idx, vref) деструктурирует tuple, возвращаемый enumerate().
Какое-то подобие деструктурирования tuple в C++ есть: std::tie() lvalue с использованием временных переменых, но более сложные случаи, вроде нижеприведенного, уже не обработаешь.
EDIT: Вставлю полный код. Параллельная обработка массива в несколько потоков:
EP>Здравствуйте, red75, Вы писали:
R>>>>Я где-то тут приводил темплейтно/макросный ужас, который нужен для более-вменяемого discriminated union.
EP>>>Готовый Boost.Variant есть уже больше 13 лет — бери и используй. Если хочется реализовать свой, то на C++14 он реализуется на порядки проще чем на C++98.
R>>Отсутствие прямой поддержки языком сложно компенсировать. Нормальный pattern-matching c case totality check библиотекой не сделаешь.
EP>Сделаешь. Pattern-matching по типам (то что нужно для Variant) есть в C++ начиная с C++98, totality check автоматом вытекает из свойств перегрузки.
EP>Лямбды для inplace-ности появились в C++11, да
Под нормальным паттерн-матчингом я имел в виду в том числе и destructuring. Вот, только что написал:
for (idx, vref) in chunk.iter_mut().enumerate() {
...
};Это получение индексов и ссылок на мутабельные элементы массива без проверок границ массива. (idx, vref) деструктурирует tuple, возвращаемый enumerate().
Какое-то подобие деструктурирования tuple в C++ есть: std::tie() lvalue с использованием временных переменых, но более сложные случаи, вроде нижеприведенного, уже не обработаешь.
match maybe_point {
Some(x,y) => {...},
None => {...},
}EDIT: Вставлю полный код. Параллельная обработка массива в несколько потоков:
crossbeam::scope(|scope| {
let chunk_len = (cubes.len()/thread_cnt as usize)+1;
for (ch_idx, chunk) in cubes[..].chunks_mut(chunk_len).enumerate() {
let start = ch_idx*chunk_len;
scope.spawn(move || {
for (idx, c) in chunk.iter_mut().enumerate() {
let cube = &self.cubes[start+idx];
*c = CubeState {
pos: cube.pos + cube.spd * dt,
rot: Basis3::from_axis_angle(cube.rot_axe, Angle::from(deg(cube.rot_spd * dt))).concat(&cube.rot),
.. *cube
};
};
});
};
});