- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我经常需要从我的 C++ 代码中调用一些 Fortran 例程。就我而言,C header 始终可用并包含诸如
之类的签名double fFortran(int* a, int* b, double* someArray, int* sizeOfThatArray)
我的问题是:是否可以编写通用的 C++14 包装器 fortranCall
(可能使用模板元编程)在必要时获取地址,然后调用 fortran 函数像这样
double someArray[2] = {1, 4};
double result = fortranCall(fFortran, 4, 5, someArray,
sizeof(someArray) / sizeof(someArray[0]));
应该等同于
double someArray[2] = {1, 4};
int sizeOfSomeArray = sizeof(someArray) / sizeof(someArray[0]);
int a = 4;
int b = 5;
double result = fFortran(&a, &b, someArray, &sizeOfSomeArray);
我认为正确的解决方案涉及参数包,但我不知道如何迭代一个参数包并在需要的地方引用。
最佳答案
对于这个答案,我将做出以下假设:
fortranCall
函数的参数中获取。调用示例:
// So, given function signature
double fFortran(int* a, int* b, double* someArray, int* sizeOfThatArray);
// we would like to call with:
fortranCall(fFortran, 4, 5, someArray);
// Likewise, given
fFortranTwoArrays(double* arrayA, int* size_of_A, double* arrayB, int* size_of_B);
// we would like to call with
fortranCall(fFortranTwoArrays, someArray, some_other_Array);
以下程序将进行如上所示的调用:
#include <tuple>
#include <type_traits>
// Functions to call eventually
double fFortran(int* a, int* b, double* someArray, int* sizeOfThatArray)
{
return 0.0;
}
double fFortranTwoArrays(double* arrayA, int* size_of_A, double* arrayB, int* size_of_B)
{
return 0.0;
}
// If T is an array
// then make a std::tuple with two parameters
// pointer to first of T and
// pointer to extent of T
template<
typename T,
typename std::enable_if <
std::is_array<T>{},
int
>::type Extent = std::extent<T>::value,
typename Ptr = typename std::decay<T>::type
>
auto make_my_tuple(T& t)
{
static auto extent = Extent;
Ptr ptr = &t[0];
return std::make_tuple(ptr, &extent);
}
// If T is not an array
// then make a std::tuple with a single parameter
// pointer to T
template<typename T,
typename std::enable_if <
!std::is_array<T>{},
int
>::type = 0
>
auto make_my_tuple(T& t)
{
return std::make_tuple(&t);
}
template<typename F, typename... Targs>
auto fortranCall(F& f, Targs&& ... args)
{
// Make a single tuple with all the parameters.
auto parameters = std::tuple_cat(make_my_tuple(args)...);
// Arrays were each expanded to
// two pointer parameters(location and size).
// Other parameters will pass as a single pointer
return std::apply(f,parameters);
}
int main()
{
double someArray[2] = {1, 4};
double result = fortranCall(fFortran, 4, 5, someArray);
double some_other_Array[] = {6,7,8,9,10};
auto result2 = fortranCall(fFortranTwoArrays, someArray, some_other_Array);
}
std::apply 是 C++17。如果你想让它在 C++14 中工作,请使用来自 https://en.cppreference.com/w/cpp/utility/apply 的示例实现
namespace detail {
template <class F, class Tuple, std::size_t... I>
constexpr decltype(auto) apply_impl(F&& f, Tuple&& t, std::index_sequence<I...>)
{
return std::invoke(std::forward<F>(f), std::get<I>(std::forward<Tuple>(t))...);
}
} // namespace detail
template <class F, class Tuple>
constexpr decltype(auto) apply(F&& f, Tuple&& t)
{
return detail::apply_impl(
std::forward<F>(f), std::forward<Tuple>(t),
std::make_index_sequence<std::tuple_size<std::remove_reference_t<Tuple>>::value>{});
}
并使用 Martin Moene ( https://github.com/martinmoene/invoke-lite ) 向后移植的调用
关于c++ - 如何编写用于在 C++14 中调用 Fortran 函数的通用包装器(按引用调用 --> 按值调用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55765162/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!