gpt4 book ai didi

c++ - 可变参数模板的正确语法

转载 作者:行者123 更新时间:2023-12-01 14:43:14 25 4
gpt4 key购买 nike

我正在尝试将一些ascii字符转换为另一个字符。但是,由于对可变参数模板语法的经验不足,因此我无法执行操作。

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;
}

正确的语法应该是什么?

最佳答案

为了拥有可变参数模板,您需要可变参数模板参数。看起来像

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。为了约束您需要使用 enable_if_t非类型模板参数添加SFINAE
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...);
}

关于c++ - 可变参数模板的正确语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60775579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com