如何创建一个方法来比较 C++ 中未知数量的字符串?
How to create a method that compares an unknown number of strings in C++?
经过一些研究,我发现在 C++ 中,我可以用这种方式创建一个具有无限变量的函数:
template<typename ... Args>
void func(Args... a) {
/* CODE */
}
我想创建一个方法来比较未知数量的字符串并给出一个布尔值:如果相等则为真,如果不相等则为假。
我做了类似的事情,但我不知道如何迭代字符串。
template<typename ... Strings>
bool cmp(string first, Strings... rest) {
/* ITERATE AND COMPARE */
return false;
}
那么我如何迭代它们呢?
术语无限变量不正确。 C++ 可以处理可变数量的函数参数,但不能处理无限多的函数参数。
如果可以使用 C++17,fold expression 将是最简单的解决方案:
template<typename ... Ts>
bool cmp(const std::string& first, const std::string& second, const Ts&... rest) {
return (cmp(second, rest) && ... && (second == first));
}
再次使用 C++17,您还可以使用递归方法 if constepxr
:
template<typename ... Ts>
bool cmp(const std::string& first, const std::string& second, const Ts&... rest) {
if constexpr (!sizeof...(Ts)) { // Do we have only two arguments left?
return first == second;
} else {
return first == second && cmp(second, rest...);
}
}
对于 C++14,您可以简单地重载两个参数版本并再次使用递归:
bool cmp(const std::string& first, const std::string& second) {
return first == second;
}
template<typename ... Ts>
bool cmp(const std::string& first, const std::string& second, const Ts&... rest) {
return first == second && cmp(second, rest...);
}
经过一些研究,我发现在 C++ 中,我可以用这种方式创建一个具有无限变量的函数:
template<typename ... Args>
void func(Args... a) {
/* CODE */
}
我想创建一个方法来比较未知数量的字符串并给出一个布尔值:如果相等则为真,如果不相等则为假。
我做了类似的事情,但我不知道如何迭代字符串。
template<typename ... Strings>
bool cmp(string first, Strings... rest) {
/* ITERATE AND COMPARE */
return false;
}
那么我如何迭代它们呢?
术语无限变量不正确。 C++ 可以处理可变数量的函数参数,但不能处理无限多的函数参数。
如果可以使用 C++17,fold expression 将是最简单的解决方案:
template<typename ... Ts>
bool cmp(const std::string& first, const std::string& second, const Ts&... rest) {
return (cmp(second, rest) && ... && (second == first));
}
再次使用 C++17,您还可以使用递归方法 if constepxr
:
template<typename ... Ts>
bool cmp(const std::string& first, const std::string& second, const Ts&... rest) {
if constexpr (!sizeof...(Ts)) { // Do we have only two arguments left?
return first == second;
} else {
return first == second && cmp(second, rest...);
}
}
对于 C++14,您可以简单地重载两个参数版本并再次使用递归:
bool cmp(const std::string& first, const std::string& second) {
return first == second;
}
template<typename ... Ts>
bool cmp(const std::string& first, const std::string& second, const Ts&... rest) {
return first == second && cmp(second, rest...);
}