gpt4 book ai didi

interface - 在 D2 中互换委托(delegate)/函数和接口(interface)

转载 作者:行者123 更新时间:2023-12-02 23:18:50 25 4
gpt4 key购买 nike

我希望能够定义一个采用接口(interface)的函数,但可以通过提供相同功能的委托(delegate)或函数来实现。例如,在 C++ 中我可以编写如下内容:

typedef std::function<int (float)> toInt;

void fun(toInt dg) { ... }

struct impl1 {
int operator()(float x) { ... }
};

int impl2(float x) { ... }

然后使用任一实现调用它:

fun(impl1());
fun(&impl2);

(这个float->int转换只是一个简化的例子来说明原理,不是我的实际功能)。

我想在 D 中实现类似的目标。我天真的尝试是这样的:

interface toInt {
int opCall(float);
}

void fun(toInt dg) { ... }

int impl2(float x) { ... }

fun(impl2);

编译器在最后一行提示它无法将 impl2 隐式转换为 toInt 类型。我可能可以添加 fun 的重载实现并使转换显式,但我想知道是否有一种更优雅和更通用的方法来执行此操作,如上面的 C++ 示例中所示。

最佳答案

he_the_great 基本上是正确的,但是以下的小改动将使它也可以与支持 opCall 的结构/类一起使用。

import std.conv;
import std.stdio;
import std.traits;

void fun ( T ) ( float value, T pred )
if ( __traits( compiles, pred( value ) ) && is( ReturnType!pred : int ) )
{
writefln( "pred( %f ) -> %s", value, pred( value ) );
}

struct impl1 {
int opCall ( float f ) {
return to!int( f );
}
}

int impl2 ( float f ) {
return to!int( f );
}

void main () {
impl1 x;
fun( 1.0, x );

fun( 2.0, &impl2 );

fun( 3.0, ( float f ){ return to!int( f ); } );
}

关于interface - 在 D2 中互换委托(delegate)/函数和接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3663489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com