Правильный синтаксис для шаблона variadi c - PullRequest
2 голосов
/ 20 марта 2020

Я пытаюсь преобразовать некоторые символы ascii в другого. Однако я не смог из-за неопытности с шаблонным синтаксисом c.

template<typename T>
void despecialize(const T& original, T& totransform, const int& charnum)
{
    if (static_cast<int>(totransform) == charnum) {
        totransform = original;
    }
}

template<typename T>
void despecialize(const T& original, T& totransform, const int& charnum, const int& charother...)
{
    despecialize(original, totransform, charnum);
    despecialize(original, totransform, charother...); //C3546 there are no parameter packs available to expand
}


std::string removePortugueseSpecialLetter(std::string& data)
{
    std::string transformed;
    for (auto& c : data)
    {
        despecialize('a', c, 176, 131, 132, 133, 134);
        transformed += c;
    }
    return transformed;
}

Какой должен быть правильный синтаксис?

1 Ответ

3 голосов
/ 20 марта 2020

Для того, чтобы иметь шаблон c, вам нужен параметр шаблона c. Это выглядит как

template <typename... VariadicTypeParater>
// or
template <some_type... VariadicNonTypeParater>

Применение этого к вашей функции даст вам

template<typename T, typename... Chars>
void despecialize(const T& original,
                  T& totransform,
                  const int& charnum,
                  const Chars&... charother)
{
    despecialize(original, totransform, charnum);
    despecialize(original, totransform, charother...);
}

Хотя это позволит передавать любой тип для Chars вместо int. Чтобы ограничить это, вам нужно добавить SFINAE, используя enable_if_t нетипичный параметр шаблона, такой как

template <typename T,
          typename... Chars,
          std::enable_if_t<(std::is_same_v<Chars, int> && ...), bool> = true>
void despecialize(const T& original,
                  T& totransform,
                  const int& charnum,
                  const Chars& charother...)
{
    despecialize(original, totransform, charnum);
    despecialize(original, totransform, charother...);
}
...