Я хотел бы иметь возможность определить функцию, которая принимает интерфейс, но может быть выполнена с делегатом или функцией, которая обеспечивает ту же функциональность.Например, в 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);
(Это преобразование с плавающей точкой -> int является лишь упрощенным примером дляпроиллюстрируйте принцип, а не мою реальную функциональность).
Я бы хотел добиться чего-то похожего в D. Моя наивная попытка была такой:
interface toInt {
int opCall(float);
}
void fun(toInt dg) { ... }
int impl2(float x) { ... }
fun(impl2);
Компилятор жалуется на этой последней строкечто он не может неявно преобразовать impl2 в тип toInt.Возможно, я могу просто добавить перегруженную реализацию fun и сделать преобразование явным, но мне было интересно, есть ли более элегантный и общий способ сделать это, как в примере C ++ выше.