我希望能够反省在编译时是否可以调用函数或函数对象;也就是说,它是否是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
的正确实现可能是什么样的?如果没有,可能会有什么近似值?