- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我们正在尝试在我的研究小组中实现一个新的 C++ 代码来执行大型数值模拟(有限元、有限差分法、拓扑优化等)。该软件将被学术界和工业界的人们使用。
对于软件的密集线性代数部分,我们想使用 Eigen 或 Armadillo。我们希望围绕这些包构建一个包装器,原因有二: 1. 向用户公开我们自己的 API 而不是第三方 API; 2. 以防我们将来需要切换库。我知道原因 2 是一种非常昂贵的保险形式,但我们使用以前的模拟软件遇到过这种情况。
我遇到的关于包装第三方库的信息来自这些来源:
我的问题与构建此包装器类的最佳方式有关。理想情况下,薄层 wrapper 是最好的,因为:
template< typename T >
class my_vec {
private:
arma::Col< T > _arma_vec;
};
或其与特征向量的等价物。
然后,我的类将第三方库类调用为:
my_vec::foo() { return _arma_vec.foo(); }
我认为(并且我想确认这一点)这个薄层的问题是我失去了从这些库在引擎盖下实现的表达式模板中获得的速度。例如,在 Armadillo 中,如下操作:
// Assuming these vectors were already populated.
a = b + c + d;
变成这样:
for ( std::size_t i = 0; i < a.size(); ++i ) {
a[i] = b[i] + c[i] + d[i];
}
由于执行了 expression templates 而没有创建任何临时对象.同样的情况也适用于 Eigen。
据我所知,我失去表达式模板能力的原因是,虽然 Armadillo 或 Eigen 不创建它们自己的临时对象,但我的类 my_vec 可以。避免这种情况的唯一方法是在它们的表达式模板周围构建一个薄层包装器。然而,在这一点上,这似乎违反了 YAGNI 原则。
这里的相关问题:
建议使用类似的东西:
my_vec a, b, c;
// ... populate vectors
a._arma_vec = b._arma_vec + c._arma_vec;
是否可以改用这样的东西?
template< typename T >
arma::Col< T > &
my_vec< T >::data() { return _arma_vec; }
a.data() = b.data() + c.data();
或者使用一些运算符重载来对用户隐藏 data()?如果我们不想直接使用这些库,还有哪些其他选择?使用宏?如果我们决定使用 C++11,还使用别名吗?
或者构建这个包装类的最方便的方法是什么?
最佳答案
仅供将来引用,这就是我决定实现我的解决方案的方式:我按以下方式重载了 operator+:
template< typename T1, typename T2 >
auto
operator+(
const my_vec< T1 > & X,
const my_vec< T2 > & Y ) ->decltype( X.data() + Y.data() )
{
return X.data() + Y.data();
}
template< typename T1, typename T2 >
auto
operator+(
const my_vec< T1 > & X,
const T2 & Y ) ->decltype( X.data() + Y )
{
return X.data() + Y;
}
template< typename T1, typename T2 >
auto
operator+(
const T1 & X,
const my_vec< T2 > & Y ) ->decltype( X + Y.data() )
{
return X + Y.data();
}
然后,我在 my_vec 类中使用以下内容重载了我的 operator=:
template< typename T >
template< typename A >
const my_vec< T > &
my_vec< T >::operator=(
const A & X )
{
_arma_vec = X;
return *this;
}
关于c++ - 如何围绕表达式模板编写第三方库包装类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28968631/
我有 asp.net mvc 2 应用程序。 现在我正在重新实现它以使用 Ninject .除了一件事,一切都很好:我应该在哪里存储 Ninject.dll ?? 我创建了 lib我的 appdir
我有一个使用第三方 FTP 库的类 http://ftps.codeplex.com/我想模拟它,这样我就可以只测试那个类而不是 FTP 库。我已经做到了,但对我来说感觉很乱。详细地说,该类使用 Al
我正在尝试关注 Ilya Grigoric's performance best practices通过内联关键的 css 和 js 并在以后异步加载所有其余部分。 我的问题是当我的页面需要第 3 方
我正在开发聊天应用程序。我有像 Skype 这样的聊天同步选项。假设我登录了设备 A,并且已经通过该设备进行了聊天。现在,当我当时登录设备 B 时,所有聊天记录都会同步到设备 B。 XMPP 问题 我
我在 VS2010 上有两个项目的解决方案。 主工程引用并依赖第二个,构建为静态库。第二个使用未在解决方案中构建的静态第三方库,但仅在第二个项目的链接器设置中引用。 如果我尝试生成解决方案,VS失败,
我想跟踪从另一个第 3 方库发出的对某些第 3 方库的调用。 示例:我想跟踪对库 A 的调用。我的应用程序静态链接库 B,而库 B 又静态链接到库 A。所以基本上我拥有的是 libAB.a 在动态链接
代码显示使用 -cp 触发器编译但未运行。显然,它找不到 HashMultimap。类路径问题? $ javac -cp google-collect-1.0.jar MultiThing.java
我所拥有的:我的代码(简单的 main.cpp)、第 3 方库的 header (EnvVar TPLIB_INCLUDE)、二进制库(TPLIB_BINARY_PATH 中的几个 .a 文件)和以下
我是 ionic 的新手,需要一些帮助: 我已经通过 here 中的教程实现了 chart.js 之类的东西,我真的很喜欢这个结果。 但我尝试用来自 processing 的 p5.js 做同样的事情
是否可以在 MonoTouch 中使用用 C# 编写的第 3 方库?例如,如果我需要进行图像处理并需要使用图像处理库... 或者重新表述问题:有人可以向我解释一下用 Objective-C 或 C#
我目前正在努力将一组 C++ 二进制文件升级为基于 Autotools 的更现代的东西,每个文件都使用自己的 Makefile 集。但是我不知道如何将第三方库(例如 Oracle Instant Cl
在过去的几个月里,我的学习速度一直很慢,并且很好奇 C++ 标准是否使用第 3 方库。我问这个的原因是因为 C++20 说可能的库更改将包括我被告知在 Boost ASIO 之后需要的网络。 Boos
我正在尝试开始使用 angular 2 cli。 我想在我的项目中使用 momentjs,所以这是我所做的: 1. 使用angular cli创建项目。 2. 运行 npm install --sav
我的配置如下: OCaml 由 Homebrew 根据其默认配方安装。它住在 /usr/local/Cellar/objective-caml/3.12.0/[bin,lib,share] ,其内容被
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: Managing 3rd party sources and binaries used by code under
所以我在项目中使用专有的 java 库,我无法访问源代码。 它抛出一个Message对象,显然我不能实现Serializable。它在整个运行时生成。 我有哪些选择?有没有办法将 Message 对象
我正在尝试使用以下方法将 Google Plus 身份验证引入 CodeIgniter: https://code.google.com/p/google-api-php-client/ 我已经把这些
我的配置中有以下内容: const viewerConfigProdWeb = merge(common.commonWebConfig, { output: { path: outputPa
在生产项目中使用 3rd 方库/组件时,您是否严格要求仅使用所述库的已发布版本? 您什么时候考虑使用库的预发布或测试版(在开发中?在生产中,在某些情况下)? 如果您遇到库的错误或缺点并且您已经 pro
我正在尝试将 qpOASES c++ 库包含在我在 RStudio 中构建的 Rcpp 项目中。 我浏览了编写 R 包和各种 Rcpp 小插图。我找到了这个 post其中引用 this存档对话。按照我
我是一名优秀的程序员,十分优秀!