Поиск, если функция является const
Я пытаюсь найти, является ли лямбда или свободная функция const с помощью метапрограммирования C++14.
Моя текущая стратегия заключается в использовании std::is_reference
, std::is_pointer
и std::is_const
по каждому из аргументов. (В настоящее время игнорируются глобальные переменные...)
Таким образом, объект типа, который проверяет, выглядит примерно так...
template <typename F>
struct is_const_func: public function_traits<decltype(&F::operator())> {};
template <typename ClassType, typename ReturnType, typename... Args>
struct is_const_func<ReturnType (ClassType::*)(Args...)> {
static const std::tuple<std::is_reference<Args>...> ref;
static const std::tuple<std::is_pointer<Args>...> ptr;
static const std::tuple<std::is_const<Args>...> con;
static const bool value = ? // Reduce(&&, (!ref && !ptr) || con)
}
Я хочу знать, как реализовать value
. В основном я хочу взять I-й элемент из каждого кортежа и вычислить (!ref[i] && !ptr[i]) || con[I]
и уменьшить полученный кортеж с &&
, все в время компиляции.
Как это реализовать? Есть ли лучший способ сделать эту проверку?
1 ответ:
Сначала найдите реализацию C++17 std apply.
Далее запишите
all_of
какconstexpr
шаблонные функции.Далее напишите
struct all_of_t{ constexpr all_of_t(){} template<class...Bs> constexpr bool operator()(Bs...bs)const{ return all_of(bs...); } };
Наконец:
static const std::tuple<std::integral_constant<bool, (!std::is_reference<Args>{}&&!std::is_pointer<Args>{})||std::is_const<Args>{}>... > arg_state; static const bool value = apply( all_of_t, arg_state );
Каждый шаг должен быть легко искать на SO.