Как убрать сужающее преобразование из int в char внутри списка инициализаторов без приведения каждого аргумента? - PullRequest
0 голосов
/ 04 февраля 2020

Вот что я пытался сделать: (по сравнению с std::vector<int>)

char s = 4;
std::vector<int> i;
std::vector<char> c;

i.insert(i.end(),{s+1,s+2,s+3}); // no warnings
c.insert(c.end(),{s+1,s+2,s+3}); // narrowing conversions of {s+1,s+2,s+3} from ints to chars

Я знаю, что могу разыграть, но это быстро становится уродливым. (особенно с большим количеством аргументов)

c.insert(c.end(),{(char)(s+1),(char)(s+2),(char)(s+3),(char)(s+4),(char)(s+5),(char)(s+6)});

Должны ли мы жить с этим? Или есть лучший способ?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Если ваш список регулярный, вы можете использовать вместо него oop, например

for (int i = 1; i <= 3; ++1)
{
    c.insert(c.end(), s + i);
}

Если он не регулярный, вы можете построить std::initializer_list, а затем использовать диапазон insert перегрузка для вставки в вектор типа

{
    auto elems  = {s+1,s+2,s+3};
    c.insert(c.end(), elems.begin(), elems.end());
}
0 голосов
/ 04 февраля 2020

Сужение преобразования в initializer_list является проблемой. См. Ответы на предупреждение: сужение преобразования C ++ 11 .

Вы можете использовать вспомогательную функцию, чтобы обойти проблему.

namespace MyApp
{
   char next(char c, int n) { return c+n; }
}

и использовать ее как

c.insert(c.end(), {MyApp::next(s, 1), MyApp::next(s, 2), MyApp::next(s, 3)});
...