Может ли этот код, который расширяет пакет целочисленных параметров, быть написан только с 1 функцией?

У меня есть код, который использует выражения сгиба для сравнения аргумента функции с целочисленными параметрами шаблона класса.
Код работает AFAIK, но мне интересно, можно ли делать то, что я хочу, без вспомогательной функции _impl.

Полный код (мой вопрос, если contains может быть реализован без contains_impl):

#include <algorithm>
#include <iostream>
#include <utility>
#include <cstdlib>
#include <tuple>

template <int H, int... T>
class if_set {
private:
template<typename... Ts>
bool contains_impl(const int& val, Ts... ts) const{
return (false || ... || (val == ts));
}
public:
bool contains(const int& val) const {
return contains_impl( val, H, T...);
}
};

using namespace std;
int main()
{
constexpr if_set<1,3,4,5> isi;
for (int i = -1; i < 10; ++i) {
cout << i << ": " << boolalpha << isi.contains(i) << endl;
}
if_set<'a','e','i','o','u', 'A', 'E', 'I', 'O', 'U'>  vowels;
string word = "ARCADE FIRE: Modern man";
cout << word << endl;
word.erase(remove_if(word.begin(), word.end(), [&vowels](const char& c){return vowels.contains (c);}), word.end());
cout << word << endl;
}

Примечание 1: я знаю, что у этого кода много проблем, я не планирую использовать его в производстве, и я отговариваю людей использовать его напрямую или для вдохновения, это игрушечный пример, который я хотел реализовать после прочтения интересного статья о замороженной библиотеке C ++.

Заметка 2: false || выглядит некрасиво, но ИДК любым приятным способом.

1

Решение

Да, ты можешь сделать это:

template <int H, int... T>
class if_set {
public:
bool contains(const int& val) const {
return ((val == H) || ... || (val == T));
}
};

В качестве альтернативы, вы могли бы просто работать на std::integer_sequences:

template<typename T1, typename T2, T1... Is>
bool contains(std::integer_sequence<T1, Is...>, T2 val) {
return (... || (val == Is)); // perhaps should be (false || ... || (val == Is)), but this appears to work
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]