如何在编译时检查可以在编译时调用函数?

时间:2017-12-13 19:53:54

标签: c++ reflection metaprogramming constexpr

我希望能够反省在编译时是否可以调用函数或函数对象;也就是说,它是否是constexpr

template<class Function>
struct is_constexpr;

这是我的第一次尝试,似乎确实有效,但可能不会概括:

#include <type_traits>
#include <iostream>

template<class Function>
struct is_constexpr
{
  template<class T,
           int = (T()(), 0)>
  static std::true_type test(const T& f);

  static std::false_type test(...);

  static const bool value = decltype(test(Function()))::value;
};

struct is_constexpr_function
{
  constexpr void operator()() const
  {
  }
};

struct is_not_constexpr_function
{
  void operator()() const
  {
  }
};

int main()
{
  std::cout << "is_constexpr_function is constexpr function object: " << is_constexpr<is_constexpr_function>::value << std::endl;
  std::cout << "is_not_constexpr_function is constexpr function object: " << is_constexpr<is_not_constexpr_function>::value << std::endl;
}

节目输出:

$ clang -std=c++14 is_constexpr.cpp -lstdc++
$ ./a.out 
is_constexpr_function is constexpr function object: 1
is_not_constexpr_function is constexpr function object: 0

这可以在C ++中正确执行吗?如果是这样,is_constexpr的正确实现可能是什么样的?如果没有,可能会有什么近似值?

0 个答案:

没有答案