C++ 检测特征对象没有eval()成员的编译时解决方案?

C++ 检测特征对象没有eval()成员的编译时解决方案?,c++,c++11,evaluation,eigen,C++,C++11,Evaluation,Eigen,大多数特征类都有一个强制求值的eval()方法。有些类没有,例如矩阵分解。有没有办法在编译时区分这些类?您可以定义自己的trait,它使用SFINAE来确定: namespace detail { template<typename T> auto has_eval_impl(void*) -> decltype(std::declval<T>().eval(), std::true_type()); template<

大多数特征类都有一个强制求值的
eval()
方法。有些类没有,例如矩阵分解。有没有办法在编译时区分这些类?

您可以定义自己的trait,它使用SFINAE来确定:

namespace detail
{
    template<typename T>
    auto has_eval_impl(void*)
        -> decltype(std::declval<T>().eval(), std::true_type());

    template<typename T>
    auto has_eval_impl(...) -> std::false_type;
}

template<typename T>
struct has_eval : decltype(detail::has_eval_impl<T>(nullptr)) { };
名称空间详细信息
{
模板
自动已执行评估(无效*)
->decltype(std::declval().eval(),std::true_type());
模板
auto具有_eval_impl(…)->std::false_类型;
}
模板
结构has_eval:decltype(detail::has_eval_impl(nullptr)){;

。我知道这个答案,但我正在寻找一个特定于本征的解决方案。你说的特定于本征的解决方案是什么意思?具有
eval()
的类可能继承自我不知道的某个类。但我必须承认,你的解决方案很酷。为什么你需要将参数传递给
has_eval_impl
?@yannick重载解析只在带参数的函数之间起作用。如果我将这两个参数都留空,编译器将告诉我不能基于返回类型重载。