如何使用范围作为函数参数?

ste*_*fen 1 d

我想使用范围作为函数参数,即调用类似于:

foo(arr,1..23)
Run Code Online (Sandbox Code Playgroud)

在功能我想做的事情

int arr[22]
arr[21] = some_other_arr[<range>]
Run Code Online (Sandbox Code Playgroud)

其中<range>1..23从上述呼叫.

那可能吗?我怎么要申报foo

Pet*_*der 5

首先,1..23它不是一个范围 - 它只是特殊的语法,只能在foreach语句中使用.

该不作为同一甲范围1..23iota(1, 23)std.range; 它返回一系列连续值(例如整数).

要将范围传递给函数,通常需要使用模板:

void foo(Range)(Range r)
{
    foreach (e; r)
        writeln(e);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以按照你想要的方式打电话:

foo(iota(1, 23)); // print the numbers from 1 to 23 (exclusive)
Run Code Online (Sandbox Code Playgroud)

注意:如果arr是数组,并且您希望索引处有一系列值,1..23则可以使用切片:

foo(arr[1..23]);
Run Code Online (Sandbox Code Playgroud)

一个数组的片是一个范围.

要让函数接受此函数,您不需要使用模板.foo可写:

void foo(int[] r)
{
    foreach (e; r)
        writeln(e);
}
Run Code Online (Sandbox Code Playgroud)