c ++编译时构造的二叉搜索树

时间:2014-01-07 23:55:11

标签: c++ c++11 binary-search-tree template-meta-programming

我希望能够说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;
}

如何做到这一点?

1 个答案:

答案 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以确认其正确构造。