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