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

Сообщение 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. Вот, только что написал:

    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. Вот, только что написал:

    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
                        };
                    };
                });
            };
        });