Разбор строки во время компиляции - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь скомпилировать следующий код:

#include <string_view>

constexpr size_t get_member_count(const char * va)
{
    const char * p = va;        
    size_t count = 1;
    while (*p != 0)
    {
        if (*p++ == ',')
        {
            ++count;
        }
    }

    return count;
}

template <const char * va>
constexpr auto get_member_names()
{
    constexpr size_t count = get_member_count(va);
    static std::basic_string_view<char> v[count];
    //fill the array here
    return v;
}

int main()
{
    constexpr const char * mem_list = "a, b, c";
    constexpr auto v = get_member_names<mem_list>();
}

И MSVC 2017, и GCC 9 не компилируют 'get_member_names ()', сообщая 'не найдено подходящей перегруженной функции' или 'нет подходящей функции дляВызовите соответственно.

Функция get_member_count компилируется, и я могу сделать:

constexpr size_t mem_count = get_member_count(mem_list);

1 Ответ

0 голосов
/ 15 февраля 2019

С [temp.arg.nontype] / 2 :

Для нетипового шаблона-параметра ссылки или типа указателя или для всех нестатических данныхчлен ссылки или типа указателя в нетиповом шаблоне-параметре типа класса или подобъекта, значение ссылки или указателя не должно ссылаться или быть адресом (соответственно):

  • [...]
  • строковый литерал ([lex.string]),
  • [...]

Итак, это:

constexpr const char * mem_list = "a, b, c";
constexpr auto v = get_member_names<mem_list>();

Не могу работать.Вы должны сделать массив статической длительности хранения.Вот так:

static const char mem_list[] = "a, b, c";
constexpr auto v = get_member_names<mem_list>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...