这个扩展整数参数包的代码可以只用1个函数编写吗?

时间:2017-05-25 20:12:37

标签: c++ template-meta-programming c++17 fold-expression

我的代码使用折叠表达式将函数参数与类模板的整数参数进行比较。 代码工作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:我知道这段代码存在很多问题,我不打算在制作中使用它,我不鼓励人们直接使用它或作为灵感,这是我想在阅读之后实现的玩具示例{{3关于冻结的C ++库。

注2:false ||看起来很难看,但IDK更好。

1 个答案:

答案 0 :(得分:2)

是的,你可以这样做:

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
}