Шаблонная лямбда-функция с константами времени компиляции - PullRequest
1 голос
/ 17 марта 2019

Я получил этот код ( split code ) онлайн, чтобы довольно круто разбивать строки, но затем я хочу сделать его немного более универсальным и управляемым.Я реализовал обходной путь, передавая его через входной параметр как шаблонный класс с constexpr, но мне было интересно, если кто-нибудь узнает, как я могу сделать эту работу.

Я сделал лямбда-функцию, которая принимает одну постоянную времени компиляции, и я пытаюсь вызвать ее.На сайте вызова он принимает параметры шаблона как выражение, пытаясь сделать оператор меньше, чем.

auto splt_val = []<char delimiter='\n'>(std::string s)->std::vector<std::string>{
              std::istringstream iss(s);
              std::vector<std::string> parm_data(
                 (std::istream_iterator<WordDelimitedBy< delimiter > >(iss)),
                  std::istream_iterator<WordDelimitedBy< delimiter > >());
              return parm_data;
};

splt_val<'\n'>("test"); //<-- DOESN'T WORK

splt_val("test");       //<-- THIS WORKS

1 Ответ

4 голосов
/ 17 марта 2019
splt_val.operator()<'\n'>("test");

да, этот синтаксис отстой.

template<char delimiter='\n'>
constexpr auto splt_val = [](std::string n)-> // ...

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

Вы, вероятно, могли бы написать:

splt_val['\n'_k]("test")

где мы пишем адаптер, но это было бы неудобно.

...