У меня есть код, который использует выражения сгиба для сравнения аргумента функции с целочисленными параметрами шаблона класса.
Код работает 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 ||
выглядит некрасиво, но ИДК любым приятным способом.
Да, ты можешь сделать это:
template <int H, int... T>
class if_set {
public:
bool contains(const int& val) const {
return ((val == H) || ... || (val == T));
}
};
В качестве альтернативы, вы могли бы просто работать на std::integer_sequence
s:
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
}
Других решений пока нет …