c++ - 类型的 constexpr 检查

标签 c++ c++14 sfinae typetraits template-argument-deduction

我正在尝试根据我是否将特征矩阵传递给它们来重载某些函数,并且我想为自己制作一些不错的 constexpr 函数以提高可读性。

为此,我决定模拟在 https://en.cppreference.com/w/cpp/types/is_same 上给出的 std::is_same 的实现。

template<class T, class U>
struct is_same : std::false_type {};

template<class T>
struct is_same<T, T> : std::true_type {};

我告诉自己,很简单:

template <typename T>
bool constexpr is_eigen() { return false; }

template <typename T, typename Eigen::Matrix<typename T::Scalar,
                                             T::RowsAtCompileTime,
                                             T::ColsAtCompileTime,
                                             T::Options,
                                             T::MaxRowsAtCompileTime,
                                             T::MaxColsAtCompileTime>>
bool constexpr is_eigen() { return true; }

但是我的 Eigen 类型解析为第一个模板特化,而不是第一个(放置一个虚拟 typename U 没有帮助)。

我也尝试过类似的东西:

template <typename T, bool is_it = std::is_same<T,
                                                Eigen::Matrix<typename T::Scalar,
                                                              T::RowsAtCompileTime,
                                                              T::ColsAtCompileTime,
                                                              T::Options,
                                                              T::MaxRowsAtCompileTime,
                                                              T::MaxColsAtCompileTime>>::value>
bool constexpr is_eigen() { return is_it; }

template <typename T, typename = std::enable_if_t<!std::is_class<T>::value>>
bool constexpr is_eigen() { return false; }

但是对于非 Eigen 类,第一个重载没有解决,并且尝试任何改变这意味着 Eigen 仍然会遇到错误的分支

基本上,我想出的任何默认分支都会被采用,即使是 Eigen 类型。我讨厌 SFINAE :(

最佳答案

您可以使用偏特化来匹配 Eigen::Matrix<...>像这样

template <typename T>
struct is_eigen_impl : std::false_type {};

template <typename T, int... Is>
struct is_eigen_impl<Eigen::Matrix<T, Is...>> : std::true_type {};

template <typename T>
constexpr bool is_eigen = is_eigen_impl<T>::value;

关于c++ - 类型的 constexpr 检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56153768/

相关文章:

c++ - BlockingQueue 的 QWaitCondition : Destroyed while threads are still waiting

c++ - 虚拟调试类卡在 std::endl 重载上

c++ - 推导参数失败,适用于返回值

c++ - 应用 SFINAE 检查是否为 T 定义了特征

c++ - 关于 reinterpret_cast 和指针

c++ - 使用 C/C++ 解析 HTTP URL

c++ - 编译器如何在不更改参数列表的情况下重载模板函数?

c++ - 模板转发对成员方法的调用

c++ - 如何让 Visual Studio 2010 不包含对 MSVC 运行时引擎的任何依赖项

c++ - 为什么可以间接地将右值绑定(bind)到左值引用而不是直接绑定(bind)?