Существуют ли constexpr или другие эквиваленты времени компиляции для функциональных возможностей STL и других библиотек для использования с метапрограммированием? В частности, я пытаюсь написать несколько метапрограмм, которые используют SFINAE для оценки некоторых условных выражений и создания соответствующих типов. Пример:
template<int A, int B>
enable_if_t<(A < B)> my_func() {// do something
}
template<int A, int B>
enable_if_t<!(A < B)> my_func() {// do nothing
}
В идеале я хотел бы, чтобы пользователь мог передавать компаратор (например, std::less<int>
), а не жестко кодировать его в <
. Итак, что-то вроде:
template<int A, int B, class comp = std::less<int>>
enable_if_t<comp(A, B)> my_func() {// do something
}
template<int A, int B, class comp = std::less<int>>
enable_if_t<comp(A, B)> my_func() {// do nothing
}
Однако, поскольку функциональные объекты не являются константными выражениями, они не оцениваются во время компиляции, поэтому это не работает. Каким будет правильный способ реализовать что-то подобное?
enable_if_t
определяется только в c++14. Как вы ожидаете, что это будет работать с С++ 11? Вы сами это определили? - person hlscalon   schedule 08.04.2016