CMAKE - Создайте список функций [duplicate]

Мое решение хорошо работает в небольших списках и вполне читаемо без зависимостей.

def merge_list(starting_list):
    final_list = []
    for i,v in enumerate(starting_list[:-1]):
        if set(v)&set(starting_list[i+1]):
            starting_list[i+1].extend(list(set(v) - set(starting_list[i+1])))
        else:
            final_list.append(v)
    final_list.append(starting_list[-1])
    return final_list

Бенчмаркинг:

lists = [[1,2,3], [ 3,5,6], [8,9,10], [11,12,13]]

% timeit merge_list (lists)

100000 циклов, лучше всего 3: 4,9 мкс на петлю

1
задан Joel 25 July 2016 в 15:41
поделиться

1 ответ

Как отметил @ Цыварев, CMake не поддерживает имена динамических функций. Итак, вот несколько альтернатив:

Простой подход

macro(my_macro ver)
    if(${ver} EQUAL 1)
        my_macro1()
    elseif(${ver} EQUAL 2)
        my_macro2()
    else()
        message(FATAL_ERROR "Unsupported macro")
    endif()
endmacro()

set(ver 1)
my_macro(ver)
set(ver 2)
my_macro(ver)

A call() Выполнение функции

Построение на Работа @Fraser вот более общая реализация функции call():

function(call _id)
    if (NOT COMMAND ${_id})
        message(FATAL_ERROR "Unsupported function/macro \"${_id}\"")
    else()
        set(_helper "${CMAKE_BINARY_DIR}/helpers/macro_helper_${_id}.cmake")
        if (NOT EXISTS "${_helper}")
            file(WRITE "${_helper}" "${_id}(\$\{ARGN\})\n")
        endif()
        include("${_helper}")
    endif()
endfunction()

set(ver 1)
call(my_macro${ver})
set(ver 2)
call(my_macro${ver})
2
ответ дан Community 16 August 2018 в 05:13
поделиться
  • 1
    Спасибо за подсказку, работайте, как ожидалось. – Joel 7 August 2016 в 21:16
Другие вопросы по тегам:

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