小编Ast*_*nus的帖子

设计F#库以供F#和C#使用的最佳方法

我正在尝试用F#设计一个库.该库应该对F#和C#都很友好.

这就是我被困住的地方.我可以使它F#友好,或者我可以使它C#友好,但问题是如何使它友好的两者.

这是一个例子.想象一下,我在F#中有以下功能:

let compose (f: 'T -> 'TResult) (a : 'TResult -> unit) = f >> a
Run Code Online (Sandbox Code Playgroud)

这完全可以从F#中使用:

let useComposeInFsharp() =
    let composite = compose (fun item -> item.ToString) (fun item -> printfn "%A" item)
    composite "foo"
    composite "bar"
Run Code Online (Sandbox Code Playgroud)

在C#中,该compose函数具有以下签名:

FSharpFunc<T, Unit> compose<T, TResult>(FSharpFunc<T, TResult> f, FSharpFunc<TResult, Unit> a);
Run Code Online (Sandbox Code Playgroud)

但当然我不想FSharpFunc签名,我想要的是Func,Action而是像这样:

Action<T> compose2<T, TResult>(Func<T, TResult> f, Action<TResult> a);
Run Code Online (Sandbox Code Playgroud)

为此,我可以创建这样的compose2函数:

let compose2 (f: Func<'T, 'TResult>) (a : Action<'TResult> ) …
Run Code Online (Sandbox Code Playgroud)

c# f#

104
推荐指数
2
解决办法
7903
查看次数

使用指向独立函数的指针调用std :: thread

我尝试使用指向函数的指针(不是指向成员函数的指针)调用std::thread完美的转发构造template< class Function, class... Args > explicit thread( Function&& f, Args&&... args );函数(),如下面的M(N)WE所示:

#include <thread>
#include <string>

static void foo(std::string query, int & x)
{
  while(true);
}

int main() {
 int i = 1;
 auto thd = std::thread(&foo, std::string("bar"), i);
 thd.join();
}
Run Code Online (Sandbox Code Playgroud)

现场演示:https://godbolt.org/g/Cwi6wd

为什么代码不能在GCC,Clang和MSVC上编译,抱怨缺少invoke(或类似名称)的重载?函数参数是指向函数的指针,因此它应该是a Callable,对吧?

请注意:我知道使用lambda可以解决问题; 我想了解问题出现的原因.

c++ stl function-pointers c++14

7
推荐指数
1
解决办法
388
查看次数

标签 统计

c# ×1

c++ ×1

c++14 ×1

f# ×1

function-pointers ×1

stl ×1