casting - 在 D 中传递带有泛型参数的函数指针

标签 casting function-pointers d void-pointers

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

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) 无法使用参数类型 (int[], void function(int* x)) 进行调用

我是否以错误的方式解决这个问题,或者我错过了什么?

最佳答案

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; });
}

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

关于casting - 在 D 中传递带有泛型参数的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24816048/

相关文章:

c++ - 将 C 风格转换为适当的 C++ 转换

C++ 将二进制数组转换为类

c++ - 使用带闭包的 lambda 回调

c++ - 尽管需要函数指针,但使用函数对象

python - Cython 函数指针和异常

c - 当我运行这个时,编译器说 :the assignment makes integer from a pointer without a cast

C++ 转换运算符和传统的 C 转换运算符

templates - 如何获取 D 模板中函数别名的名称?

templates - 使用 D 特征获取其实例的模板参数值

d - D 中的 Ada 风格范围类型