Замена для #import в Visual C++

этот другой подход с использованием функционального программирования

    <?php


$data =  json_decode('[
    {
        "id": 1,
        "value1": 5,
        "value2": 10
    },
    {
        "id": 2,
        "value1": 50,
        "value2": 100
    },
    {
        "id": 1,
        "value1": 1,
        "value2": 2
    },
    {
        "id": 2,
        "value1": 15,
        "value2": 20
    },
    {
        "id": 3,
        "value1": 15,
        "value2": 20
    }
]');

//print_r(array_group_by($data,'id'));
print_r(array_sum_by($data,'id',['value1','value2']));
//print_r(array_sum(array_column($data,'value1')));

function array_sum_by($array,$group,$keys)
{
     $groupeddata = array_group_by($array,$group);
    return  array_map(function($items) use($group,$keys) { 

        foreach($keys as $key)
        {
            $values[$key] = array_sum(array_column($items,$key));
        }
        $first = array_shift($items);
        if(is_object( $first ) && isset( $first->{ $group } )){
            $values = array_merge([ $group => $first->{ $group } ], $values);
        }elseif(isset($first[$group])){
            $values = array_merge([ $group => $first[$group] ], $values);
        }
        return $values;
    },$groupeddata); 
}

function array_group_by( array $array, $key )
    {
        if ( ! is_string( $key ) && ! is_int( $key ) && ! is_float( $key ) && ! is_callable( $key ) ) {
            trigger_error( 'array_group_by(): The key should be a string, an integer, or a callback', E_USER_ERROR );
            return null;
        }
        $func = ( is_callable( $key ) ? $key : null );
        $_key = $key;
        // Load the new array, splitting by the target key
        $grouped = [];
        foreach ( $array as $value ) {
            if ( is_callable( $func ) ) {
                $key = call_user_func( $func, $value );
            } elseif ( is_object( $value ) && isset( $value->{ $_key } ) ) {
                $key = $value->{ $_key };
            } elseif ( isset( $value[ $_key ] ) ) {
                $key = $value[ $_key ];
            } else {
                continue;
            }
            $grouped[ $key ][] = $value;
        }
        // Recursively build a nested grouping if more parameters are supplied
        // Each grouped array value is grouped according to the next sequential key
        if ( func_num_args() > 2 ) {
            $args = func_get_args();
            foreach ( $grouped as $key => $value ) {
                $params = array_merge( [ $value ], array_slice( $args, 2, func_num_args() ) );
                $grouped[ $key ] = call_user_func_array( 'array_group_by', $params );
            }
        }
        return $grouped;
    }
29
задан Rob Walker 16 March 2009 в 15:09
поделиться

6 ответов

Почему не всего #include сгенерированные заголовки создаются от #import?

25
ответ дан Matt Davison 14 October 2019 в 08:30
поделиться

(Я немного опаздываю к этому вопросу, но это - проблема, близкая и дорогая для моей основы.)

Вы могли попытаться использовать олдскульный способ получить доступ к COM-объектам от C/C++. Это вовлекает разработчиков COM-объектов, обеспечивающих клиентские.h файлы, которые имеют версии C/C++ COM-интерфейсов. Эти файлы похожи на более простые версии того, что делает #import.

, Куда эти файлы прибывают из? Если COM-объекты записаны в C/C++ (VC ++), чем они прибывают из компилятора MIDL. Этот инструмент командной строки берет файлы ODL/IDL и создает исходный код C/C++ из них. Часть из того, что это испускает, полезна для клиентского приложения.

, Если у Вас есть источник COM-объектов, у Вас могут уже быть эти файлы!

, Если у Вас только есть файлы TLB, можно использовать Средство просмотра OLE/COM-объекта (OLEVIEW.exe - шел, по крайней мере, с VC ++ 6.0), Вы открываете библиотеку типов и сохранить Как и СТАРЫЙ файл / файл IDL. Тогда работайте, компилятор MIDL для генерации клиентского C/C++ включают файлы. Существует ничтожный шанс, что сторонний COM-объект может идти с этими файлами, но они часто не делают (я вспоминаю, что Crystal Reports сделал некоторое время, затем прекратил поставлять их - завинчивание нас по-царски - но я отступаю).

Используя интеллектуальные указатели ATL (и другие классы поддержки) с интерфейсными классами MIDL создает, почти в хорошем как, что создает #import. Это зависит от того, сколько из #import-specific функций Вы используете.

Для / MP я сделал и что я предлагаю и часть из того, что предлагает принятый ответ Matt Davison.

8
ответ дан Aardvark 14 October 2019 в 08:30
поделиться

Одна опция состоит в том, чтобы переместить импорт в отдельный DLL и предоставить классы обертки им использующий непрозрачный указатель. Тогда отключите / MP для того DLL только, и остальная часть Вашей сборки должна быть прекрасной.

2
ответ дан Eclipse 14 October 2019 в 08:30
поделиться

Вы могли разделить проект на две части, та, которая более или менее делает импорт, отключающий / MP и тот, который делает все остальное включающее / MP.

1
ответ дан dalle 14 October 2019 в 08:30
поделиться

http://msdn.microsoft.com/en-us/library/bb385193.aspx

мс говорит, что это не совместимо

-2
ответ дан Daniel 14 October 2019 в 08:30
поделиться

Вы можете использовать параметр / MP для всего проекта, а затем сделать исключение для отдельного файла с помощью параметра / MP1 .

7
ответ дан 28 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: