Amethyst Studio
204 words
1 minutes
现代C++模板 - contain all none any

Problem#

实现contain_allcontain_anycontain_none函数,效果如下:

std::vector<int> nums {1,2,3,4,5,6};

std::cout << contain_all(nums, 3, 4) << std::endl;     // true
std::cout << contain_all(nums, 3, 4, 7) << std::endl;  // false
std::cout << contain_any(nums, 7) << std::endl;        // true
std::cout << contain_any(nums, 0, 11, 7, 21) << std::endl;  // false
std::cout << contain_none(nums, 0, 11, 7, 21) << std::endl;  // false

但是注意,需要使用模板来实现。


Implementation#

利用”Variadic Parameters”以及”Fold Expression”

template<typename Container, typename T>
bool contains(const Container& C, T&& v) {
  return C.end() != std::find(C.begin(), C.end(), v);
}

template<typename Container, typename... Values>
bool contain_any(const Container& C, Values &&... values) {
  return (... || contains(C, values));
}

template<typename Container, typename... Values>
bool contain_all(const Container& C, Values &&... values) {
  return (... && contains(C, values));
}

template<typename Container, typename... Values>
bool contain_none(const Container& C, Values &&... values) {
  return !(... || contains(C, values));
}

另外,contain_none也可以利用contain_any来实现,但要注意我们的参数使用了转发引用,因此需要forward。

template<typename Container, typename... Values>
bool contain_none(const Container& C, Values&&... values) {
  return !contain_any(C, std::forward<Values>(values)...)
}
现代C++模板 - contain all none any
https://ziyue.cafe/posts/cpp-template-contain/
Author
Kaida Amethyst
Published at
2022-02-27