我希望能够说trim<' ', '\t', '\n'>(str)
,让它使用下面的is_ws<' ', '\t', '\n'>(ch)
作为谓词。我希望谓词对每个ch
进行O(log(N))比较。没有编译(模糊签名)O(N)片段来证明这个想法:
template <char W1, char...Wn> bool is_ws(char ch) {
return is_ws<W1>(ch) || is_ws<Wn...>(ch);
}
template <char W> bool is_ws(char ch) {
return W == ch;
}
如何做到这一点?
答案 0 :(得分:2)
我做了完全相同的事情,除了我作弊并使用了一个位域(32位),但我确实从模板参数中编译了位域组件:
template <char...> struct CtrlVec ;
template <char c> struct CtrlVec<c>
{ static_assert( ( c < 0x20 ), "Only for control characters" ) ; enum { mask = ( 1 << c ) } ; } ;
template <char c, char... cs> struct CtrlVec<c, cs...>
{ static_assert( ( c < 0x20 ), "Only for control characters" ) ; enum { mask = ( 1 << c) | CtrlVec<cs...>::mask } ; } ;
如果您在搜索时没有设置,我将创建一个排序的char "\t\n "
数组并使用std::lower_bound
进行搜索。我还会对数组的元素进行static_assert
以确认其正确构造。