Обмен делегатом / функцией и интерфейсом в D2

Я хотел бы иметь возможность определять функцию, которая принимает интерфейс, но может быть выполнена с помощью делегата или функции, обеспечивающей ту же функциональность. Например, в 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. Я, вероятно, могу просто добавить перегруженную реализацию развлечения и сделать преобразование явным, но мне было интересно, есть ли более элегантный и общий способ сделать это, как в приведенном выше примере C ++.

6
задан Eitan 7 September 2010 в 23:31
поделиться