Поиск, если функция является 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 2

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.