2013-10-06 1 views
6

У меня есть две функции: одна является скалярное умножение на вектор и другой - вектор-матричного умножения:Как обеспечить, чтобы тип шаблона был скалярен в D?

pure T[] mul(S, T)(S s, T[] a) 

и

pure T[] mul(T)(T[] a, T[][] B) 

Конечно, это приводит к конфликту, поскольку S может быть вектор, так что первый шаблон покрывает второй. Как сообщить компилятору, я хочу, чтобы только скалярный тип был S?

ответ

10

Вам необходимо использовать template constraint.

pure T[] mul(S, T)(S s, T[] a) if (isScalarType!S) 

Это говорит о том, что шаблон должен быть рассмотрен только тогда, когда isScalarType!S является true.

isScalarType можно найти в std.traits.

В D скалярные типы представляют собой числовые типы, типы символов и bool. Вы можете ограничить дальнейшее использование других признаков от std.traits, если хотите (например, isNumeric или isFloatingPoint).

Смежные вопросы