这段扩展整数参数包的代码可以只用1个函数来写吗?
Can this code that expands integer parameter pack be written with just 1 function?
我有代码使用折叠表达式将函数参数与 class 模板的整数参数进行比较。
代码工作 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:我知道这段代码有很多问题,我不打算在生产中使用它,我不鼓励人们直接使用它或作为灵感,这是我在阅读有趣的文章后想实现的玩具示例article 关于冻结的 C++ 库。
注 2:false ||
看起来很丑,但 IDK 有更好的方法。
是的,你可以做到:
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
}
我有代码使用折叠表达式将函数参数与 class 模板的整数参数进行比较。 代码工作 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:我知道这段代码有很多问题,我不打算在生产中使用它,我不鼓励人们直接使用它或作为灵感,这是我在阅读有趣的文章后想实现的玩具示例article 关于冻结的 C++ 库。
注 2:false ||
看起来很丑,但 IDK 有更好的方法。
是的,你可以做到:
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
}