2017-05-25 49 views
1

我有代碼使用摺疊表達式來比較函數參數與類模板的整數參數。 代碼作品AFAIK,但我想知道是否有可能沒有_impl幫助函數做我想做的事情。這個擴展整數參數包的代碼可以用1個函數寫嗎?

的完整代碼(我的問題是,如果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有更好的方法。

+0

爲什麼不'回報(VAL == 1H)|| (... || val == T);'? – Justin

+0

因爲一些奇怪的錯誤:prog.cc:在成員函數'bool if_set :: contains(const int&)const': prog.cc:17:38:錯誤:fold表達式的操作數沒有未展開的參數包 return val == H)|| (... || val == T); – NoSenseEtAl

回答

2

是的,你可以做到這一點:

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

或者,你可能只是在std::integer_sequence的工作:

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 
} 
+0

啊,我需要extra()(val == H)|| ... || (val == T)..和錯誤味精是超級無益的......:/另一個有趣的C++功能。你知道爲什麼()是必需的嗎? – NoSenseEtAl

+0

@NoSenseEtAl由於摺疊表達式需要用圓括號包圍。 '(... || Bools)'是有效的,而'... || Bools'不是。至於原因,我猜測是因爲它更容易確定fold表達式的確切位置。 – Justin

+1

根據cppreference,表達式的規則是「不包含優先級低於最高級別的操作符的操作符」A'=='低於強制轉換。所以非常多的括號,但你應該可以做一些像'!(val == T)&& ...'或'f(val,T)|| ...或者好[T] || ...'等。另外,你不能'模板等等等等返回((val == T)|| ...);'?也就是說,爲什麼有'H'? – TrentP

相關問題