cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Библиотека флагов компиляции #379

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +21, -0 Автор идеи: Андрей Руссков

Добавить модуль с набором constexpr-переменных, зависящих от флагов компиляции

Ни для кого не секрет, что как только поведение программы начинает зависеть от компилятора и системы сборки, начинается макросный ад. По сути, каждый пишет свои костыли для одного и того же.

Предлагаю решение: простой модуль, в котором будет собран набор constexpr переменных/consteval функций, зависящих от всего этого внешнего безобразия и не транслирующий никакие из этих макросов наружу. По сути, упростит написание переносимых библиотек, в т.ч. и стандартной

enum class build_type_t {
    release,
    debug,
    profile,
    // ...
};

constexpr auto build_type = build_type_t::release/**/;

constexpr string_view toolchain_name = "gcc"/**/;

struct toolchain_version_t {
    size_t major;
    size_t minor;
    size_t bugfix;
    // ...
};

constexpr toolchain_version_t toolchain_version { 9, 3, 1 /**/ };

consteval bool supports_standard(string_view revision) {
    constexpr unordered_set<string_view> revisions = {
        "c++98",
        "c++03",
        "c++0x",
        "c++11",
        "c++0y",
        "c++14",
        "c++20",
        // ...
    };

    // Рано или поздно constexpr контейнеры всё равно заедут,
    // как и contains, но можно написать через if constexpr
    return revisions.contains(revision);
}

consteval bool supports_feature(string_view feature) {
    constexpr unordered_set<string_view> features = {
        "concepts",
        "contracts",
        // ...
    };
    return features.contains(feature);
}

consteval bool supports_architecture(/*...*/) { ...

ну и так далее по аналогии.

apolukhin commented 3 years ago

Александр Коновалов, 6 января 2019, 20:52 М.б. ошибаюсь, но что-то похожее среди предложений я видел.