templates - 键入 trait 以检查 Eigen 类型是表达式(无存储)还是矩阵或数组(有存储)?
问题描述
我正在尝试使用一些模板魔术来区分两种类型的特征类型。
Matrix 或 Array 的特化类型,如 MatrixXd、VectorXd 等。这些类型有自己的数据存储。
表达式类型,即 CwiseBinaryOp 等。这些是由表达式返回的类型,如
a + b
.
目标:目标是允许以下函数模板有不同的行为:
template<typename T, typename Functor>
decltype(auto) func(const Functor& functor, T&& input) {
if constexpr ([T is expression or lvalue reference of non-expression]) {
return functor(std::forward<T>(input));
} else /*[T is rvalue reference of non-expression]*/ {
// update in-place
input = functor(std::forward<T>(input));
return std::move(input)
}
}
这样我可以包装任何 lambda 或仿函数(注意:这个仿函数的实现与[](auto&& input){return [expr]
} 类似,因此它返回一个构建在输入之上的表达式,它可能已经是也可能不是表达式),func
所以我可以选择在评估表达式时,根据我是否调用input
或.input
func(input)
func(std::move(input))
有任何想法吗?谢谢!
编辑:
这是我找到的解决方案:
template<typename Derived>
struct has_storage
: std::is_base_of<Eigen::PlainObjectBase<std::decay_t<Derived> >, std::decay_t<Derived> >
{};
... //in func body:
if constexpr (std::is_lvalue_reference<T>::value || !has_storage<T>::value) {...}
解决方案
推荐阅读
- javascript - 在 NodeJS 中循环后获取新数组值时遇到问题
- angular - Angular 8 Resolver 不工作:没有 Resolver 的提供者
- javascript - 循环对象数组返回一个数组
- sql-server - 如何正确截断 ETL 管道中的临时表?
- angularjs - 如何在 ng-repeat 中访问子范围
- html - 居中的图像,右侧有文字
- javascript - Javascript - 将对象键打印到 HTML
- c++ - 如何将 Affine3d 应用于 Vector3d
- git - 文件前面的“~$”是什么意思?
- google-app-engine - 从裸根域提供文件