【问题标题】:Passing function pointers with generic arguments in D在 D 中传递带有泛型参数的函数指针
【发布时间】:2014-09-09 01:30:53
【问题描述】:

我正在尝试为数组创建一个“每个”方法的实现。我希望能够像这样使用它:

void each(void*[] arr, void function(void*) f) {
    assert(arr != null);
    foreach(int i, void* x ; arr){
        f(&x);
    }
} 
void setToFive(int* x){
    *x = 5
}

int main(){
    int[] arr = new int[50];
    each(arr, &setToFive);
    writeln(arr);
    return 0;
}

但是,我得到了错误: function test.each (void*[] stuff, void function(void*) f) is not callable using argument types (int[], void function(int* x))

我是以错误的方式解决这个问题,还是我遗漏了什么?

【问题讨论】:

    标签: casting function-pointers d void-pointers


    【解决方案1】:

    int[] 不能转换为 void* 数组。我建议使用模板。

    void each(Type)(Type[] array, void delegate(ref Type) cb){
        foreach(ref element; array)
            cb(element);
    }
    
    void main(){
        int[] arr = new int[50];
        arr.each((e){ e += 5; });
    }
    

    我目前无法检查它是否正确编译,但它应该给你一个想法。

    【讨论】:

    • 使用 DMD,我需要稍作修改:arr.each((ref int e) {e += 5})。如果没有明确指定,编译器似乎不会假定 e 是一个 ref。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多