c++ - constexpr 检查类型
问题描述
我正在尝试根据是否将特征矩阵传递给它们来重载某些函数,并且我想让自己成为一些不错的constexpr
函数以提高可读性。
为此,我决定模仿https://en.cppreference.com/w/cpp/types/is_samestd::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 仍然会命中错误分支
基本上,我提出的任何默认分支即使是特征类型也会被采用。我讨厌 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;
推荐阅读
- ios - 在另一个框架中弱链接一个第三方框架
- rust - nalgebra:为通用 MatrixMN 实现函数
- python - 将字典值中的列表列表组合到单个表达式python 3.7中的元组列表中
- c - 在 c 编程中的递归函数中更新了动态列和行大小的二维数组
- nlp - 在 Watson Knowledge Studio 中为自定义实体类型创建 json 文件
- java - 正则表达式 "[a-zA-Z0-9_]+(?i).concat\\([ -~]*\\ " 导致大字符串的灾难性回溯
- robotframework - 在 Robot Framework 后台运行关键字
- ios - 如何使用 Struct Encodable、iOS、Swift 在 Alamofire 中发布没有键的对象数组
- c - 用于计算文件中“int”运算符的有限状态机 - 不起作用
- jquery - 当 onClick 功能在同一网页上显示/隐藏不同内容时如何获取相同的 URL?