2014-01-07 1 views
3

Я хочу сказать trim<' ', '\t', '\n'>(str), использовать его is_ws<' ', '\t', '\n'>(ch) под предикатом. И я хочу, чтобы предикат выполнял сравнения O (log (N)) для каждого ch. Не компиляция (неоднозначная подпись) O (N) фрагмент для демонстрации идеи:C++ время компиляции построено двоичное дерево поиска

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; 
} 

Как это сделать?

ответ

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 на элементах массива, чтобы подтвердить его правильную конструкцию.

+0

является 'std :: is_sorted()' a constexpr? – bobah

Смежные вопросы