Язык D: Считаются ли сигнатуры функций с ограничениями равными, если они ссылаются непосредственно на тип или имена параметров? - PullRequest
4 голосов
/ 16 мая 2011

Учитывая приведенные ниже сигнатуры функций (и их ограничения), будут ли они считаться одинаковыми?Оба проходят мои юнит-тесты, так что я вынужден поверить, что они могут быть, но я хотел бы знать, действительно ли они идентичны или отличаются (но ведут себя одинаково):

Здесь ограничение подписиссылается на имена параметров (я понимаю, что информация времени выполнения недоступна, я предполагаю, что компилятор использует их для обозначения типов стога и иголки):

T[] find(T, E)(T[] haystack, E needle) 
  if(is(typeof(haystack[0] != needle) == bool)) 
{
  // ...
}

Теперь, если я обновлюсь, чтобы сослаться натипы T и E, это все еще работает.Мне больше нравится эта форма, потому что она явно показывает, что мое сигнатурное ограничение ищет типы (а не информацию времени выполнения) ... и хорошо, что она более краткая:

T[] find(T, E)(T[] haystack, E needle) 
  if(is(typeof(T != E) == bool)) 
{
  // ...
}

Верны ли мои предположения или я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 16 мая 2011

лично я бы использовал if(is(typeof(T.init != E.init) == bool)), чтобы убедиться, что речь идет о переменных типа

(а затем, когда вы хотите, чтобы T был диапазоном (и потерять нотацию массива, это будет if(isInputRange(T) && is(typeof(T.init.front != E.init) == bool)))


edit: лучший способ проверить подобные вещи, расширив контрольный пример:

если мы возьмем другую функцию:

int binarySearch(T,E)(T[] haystack, E needle)
    if(is(typeof(haystack[0] < needle) == bool)) {
//...
   return -1;
}

это компилируется и работает так, как вы ожидаете (за исключением деталей реализации ...)

но

int binarySearch(T,E)(T[] haystack, E needle)
    if(is(typeof(T < E) == bool)) {
//...
   return -1;
}

не (вызов binarySearch([1,2,3],0); не компилируется)

однако, как мой оригинальный ответ:

int binarySearch(T,E)(T[] haystack, E needle)
   if(is(typeof(T.init > E.init) == bool)) {
    //...
    return -1;
}

это работает как ожидалось

2 голосов
/ 18 мая 2011

Сначала я подумал, что сигнатура функции не связана со статическими ограничениями. При использовании ваша функция генерируется , как и ее подпись, я думаю. Ограничения просто для устранения неоднозначности и / или генерирования ошибок во время компиляции, я предполагаю, что вы не можете говорить о сигнатуре функции шаблона, но, возможно, как сигнатура шаблона:)

В вашем примере, я полагаю, вы хотите проверить конвертируемость из одного типа в другой, скажем, E в T (это int в массиве double), который записан с is(E : T) или используя удобный шаблон isImplicitlyConvertible в std.traits.

В первом примере вы проверяете, что сравнение значений haystack[0] и needle возможно, но нет никаких шансов, что вы сможете найти 3.14 в массиве int, однако вы можете сравнить int на плаву, так что это static if кажется слишком разрешительным.

...