Существуют ли альтернативы constexpr с определениями массивов указателей символов в C ++ 11 и C ++ 14? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть некоторый код, который я использую, чтобы дать мне список строк, которые совпадают с именами членов перечисления, чтобы я мог легко анализировать текстовые файлы, которые используют имена, в перечисления. (Я на самом деле генерирую его автоматически с помощью макроса, но это уже другая история.) Код прекрасно работает на современных компиляторах, работающих на C ++ 17, но одна из моих целевых платформ не имеет поддержки C ++ 17, и я хотел бы прийти с альтернативой, которая работает на C ++ 14 (и в идеале C ++ 11). Текущий код:

class A 
{
    enum MatchType { Linear, Square };
    static constexpr const char * matchTypeStrings[ 2 ] = { "Linear", "Square" };
    static const size_t matchTypeCount = 2;
};

Я бы предпочел не указывать глобальную область действия enum, потому что это никогда не заканчивается хорошо, и в идеале я не хочу добавлять что-либо в один из файлов. cpp ( что, конечно, исправит ошибку компоновщика, но я думаю, что это не рекомендуется для кода C ++ 17 и не будет работать с моим макросом в любом случае). Я мог ли я создать функцию-член, которая могла бы вместо этого возвращать строковое значение, но я не могу придумать, как это сделать.

1 Ответ

2 голосов
/ 09 апреля 2020

Использование функции-члена stati c:

#include <cstdint>
#include <iostream>

class A 
{
public:
    enum MatchType { Linear, Square };
    static const char * matchTypeStrings(MatchType type)
    {
        static const char * const matchTypeStrings[ 2 ] = { "Linear", "Square" };
        return matchTypeStrings[type];
    }
    static const std::size_t matchTypeCount = 2;
};

int main()
{
    std::cout << A::matchTypeStrings(A::Linear) << '\n';
    std::cout << A::matchTypeStrings(A::Square) << '\n';
}

Важно отметить, что это явно не constexpr, однако G CC и Clang удается сгенерировать аналогичный код с включенной оптимизацией. (В обозревателе компилятора: Ваша версия , Stati c function )

...