К сожалению, вы можете указать только конструкцию в предложении where в этом экземпляре. Кажется странным, что вы не можете указать Int16, Int32 и т. Д., Но я уверен, что существует некоторая глубокая причина внедрения, лежащая в основе решения не допускать типы значений в предложении where.
Я предполагаю, что единственное решение должно выполнить проверку времени выполнения, которая, к сожалению, предотвращает проблему, возникающую во время компиляции. Это было бы похоже на: -
static bool IntegerFunction<T>(T value) where T : struct {
if (typeof(T) != typeof(Int16) &&
typeof(T) != typeof(Int32) &&
typeof(T) != typeof(Int64) &&
typeof(T) != typeof(UInt16) &&
typeof(T) != typeof(UInt32) &&
typeof(T) != typeof(UInt64)) {
throw new ArgumentException(
string.Format("Type '{0}' is not valid.", typeof(T).ToString()));
}
// Rest of code...
}
Который немного уродлив, я знаю, но по крайней мере предоставляет требуемые ограничения.
Я также посмотрел бы на возможную производительность последствия для этой реализации, возможно, есть более быстрый выход.
Основным недостатком использования .mm
по сравнению с .m
для «нормального» Objective-C является то, что время компиляции значительно выше для Objective-C ++. Это потому, что компилятор C ++ занимает больше времени, чем компилятор C. С Xcode 3.2 и выше код Objective-C может использовать цепочку инструментов внешнего интерфейса Clang , чтобы значительно ускорить время компиляции Objective-C / C. Поскольку Clang еще не поддерживает Objective-C ++ / C ++, это еще больше увеличивает разрыв во времени компиляции между ними.
Лучшая стратегия - использовать .m
по умолчанию. Если вам понадобится использовать Objective-C ++ на более поздних этапах разработки, нет ничего плохого в том, чтобы переименовать файл для использования расширения .mm
. Если это так изнутри XCode, проект будет автоматически обновлен для использования вновь названного файла.
Конечно, все стандартные предупреждения применяются, когда вы пытаетесь сравнить производительность Objective-C ++ и Objective-C во время выполнения. Поскольку Objective-C ++ является надмножеством C ++, а Objective-C - надмножеством C, вы имеете дело с двумя разными языками, каждый из которых имеет компромисс между производительностью и временем выполнения. Учитывая, что вы вообще используете Objective-X, вы, скорее всего, пишете приложение уровня пользователя (не приложение уровня системы), и разница в производительности между C и C ++, вероятно, будет полностью определяться вашими способностями кодировать эффективные алгоритмы в каждый язык. Если вы разработчик на C ++, вы, вероятно, будете писать код лучше, чем на C и наоборот. Поэтому, как всегда, используйте соответствующий инструмент для работы.
Для справки, вас также может заинтересовать этот ответ: C против C ++ (Objective-C против Objective-C ++) для iPhone
ОБНОВЛЕНИЕ 17 февраля 2012 г. Начиная с Xcode 4.0 (с LLVM 3.0), Clang поддерживает Objective-C ++. Даже поддержка C ++ 11 сейчас достаточно сильна.
Если вы используете только функции C, файлы .mm должны генерировать код, который работает очень похоже на .m
Также нет недостатка в переименовании файла позже .m в .mm, когда вам нужны функции C ++.