代码之家  ›  专栏  ›  技术社区  ›  ssb

查找函数是否为常量

  •  2
  • ssb  · 技术社区  · 7 年前

    我目前的策略是使用 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 回复  |  直到 7 年前
        1
  •  2
  •   Yakk - Adam Nevraumont    7 年前

    首先找到一个C++17 std应用程序的实现。

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