Некоторые люди считают заголовочные файлы преимуществом:
В конечном итоге система заголовков является артефактом 70-х годов, когда C был спроектирован. В то время у компьютеров было очень мало памяти, и сохранение всего модуля в памяти просто не было вариантом. Компилятор должен был начать читать файл вверху, а затем продолжить линейно через исходный код. Механизм заголовка позволяет это. Компилятор не должен учитывать другие единицы перевода, он просто должен прочитать код сверху вниз.
И C ++ сохранил эту систему для обратной совместимости.
Сегодня это без разницы. Он неэффективен, подвержен ошибкам и сложнее. Есть гораздо лучшие способы разделить интерфейс и реализацию, если , что была целью.
Однако одно из предложений для C ++ 0x состояло в том, чтобы добавить правильную систему модулей, позволяя компилировать код, подобный .NET или Java, в более крупные модули, все в одном и без заголовков. Это предложение не делало сокращения в C ++ 0x, но я считаю, что он все еще находится в категории «мы бы хотели сделать это позже». Возможно, в TR2 или аналогичном.
Вы можете сделать всю общую функцию:
private void Pager & lt; T & gt; (IEnumerable & lt; t & gt; tEnum) {// здесь T может быть любым} // вы можете называть его как : Pager (новый int [] {10,20}); Pager (новая строка [] {"meep", "x"});
private void Pager & lt; T & gt; (IEnumerable & lt; t & gt; tEnum) {...}
Если вы посмотрите на LINQ-to-objects, так же как и они делают (без дополнительного этого
до IEnumerable & lt; T & gt;
в соответствии с синтаксисом метода расширения.)
private void Pager (IEnumerable & lt; object & gt; tEnum)
работать. Казалось бы, полезно не указывать методу, какой тип Т. Как вы думаете?
– Bazzz
9 August 2011 в 14:36
IEnumerable & lt; T & gt;
помечен как ковариантный (он фактически объявлен как IEnumerable & lt; out T & gt;
). Не зная внутренности метода, трудно сказать, будет ли подход значительно хуже, но я думаю, что в целом лучше просто сделать метод общим.
– dlev
9 August 2011 в 14:38
IEnumerable & lt; int & gt;
без необходимости удаления элементов на перечисление, тогда как IEnumerable & lt; object & gt;
будет в этой ситуации.
– dlev
9 August 2011 в 14:55
Возможно, этот способ?
private void Pager & lt; t & gt; (IEnumerable & lt; t & tnnum)