Большинство важных вещей о C++ обрабатывает по шаблону … извлеченный урок

Если я понимаю вас правильно, вот что вы хотите.

SET @start_res = 20150301;
SET @finish_res= 20150501;
SET @finish_check= 20150801;
SET @start_check= 20150301;
SET @daily_hos= 3;

SELECT 

(SELECT COUNT(DAY_IN) FROM t_hospital WHERE 
DAY_IN between  @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res and 
ID_daily_hos =@daily_hos) AS 'arr' ,

(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE 
PAT_STATUS  like '%ong%' and  
DAY_IN between @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) AS 'ONG1' ,

(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE 
PAT_STATUS  like '%rtde%' and  
DAY_IN between  @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) AS 'RTED' ,

(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE 
PAT_STATUS  like '%pol%' and 
DAY_IN between @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) AS 'POLI' ,

(SELECT COUNT(PAT_STATUS) FROM t_hospital WHERE 
PAT_STATUS  like '%para%' and  
DAY_IN between @start_check and @finish_check and 
RES_DATE between @start_res and @finish_res  and 
ID_daily_hos =@daily_hos) AS 'para'
14
задан strager 1 March 2009 в 01:30
поделиться

11 ответов

От [1 110] "Исключительный стиль C++", Объект 7: функциональное разрешение перегрузки происходит прежде шаблонная специализация. Не смешивайте перегруженную функцию и специализации шаблонных функций, или Вы находитесь в для противного удивления, в котором на самом деле вызвана функция.

template<class T> void f(T t) { ... }   // (a)
template<class T> void f(T *t) { ... }  // (b)
template<> void f<int*>(int *t) { ... } // (c)
...
int *pi; f(pi); // (b) is called, not (c)!

вдобавок к [1 111] Объект 7 :

Хуже все же при исключении типа в шаблонной специализации, отличающийся , шаблон функции мог бы быть специализирован в зависимости от порядка определения, и в результате специализированная функция может или не может быть вызвана.

Случай 1:

template<class T> void f(T t) { ... }  // (a)
template<class T> void f(T *t) { ... } // (b)
template<> void f(int *t) { ... }      // (c) - specializes (b)
...
int *pi; f(pi); // (c) is called

Случай 2:

template<class T> void f(T t) { ... }  // (a)
template<> void f(int *t) { ... }      // (c) - specializes (a)
template<class T> void f(T *t) { ... } // (b)
...
int *pi; f(pi); // (b) is called
18
ответ дан 1 December 2019 в 06:16
поделиться

Это не может быть популярно, но я думаю, что это должно быть сказано.

Шаблоны являются сложными.

Они удивительно мощны, но используют их мудро. Не также сходите с ума, не имейте слишком многих аргументов шаблона... Не имейте слишком многих специализаций... Помните, другие программисты должны считать это также.

И больше всего, держитесь подальше от шаблонного метапрограммирования...

7
ответ дан 1 December 2019 в 06:16
поделиться

Я должен был бы сказать, что Coplien Любопытно повторяющийся шаблонный шаблон (CRTP) является одним шаблонным приемом, которого я достигаю по & снова. По существу это позволяет Вам вводить статически настроенную функциональность в производный класс путем наследования базовому классу, который параметризован на имени производного класса. Следите за испугом, но удивительно полезный (некоторый вызов это статический полиморфизм).

кроме того, я буду совет второго Neil Butterworth считать "Шаблоны C++" и добавить Alexandrescu современный Дизайн .

C++
6
ответ дан 1 December 2019 в 06:16
поделиться

Этот вопрос немного похож, "я собираюсь реализовать большую часть своей библиотеки с помощью функций, каковы частые ошибки в использовании функций?" Это твердо придумать разумные ответы на такие вопросы, но здесь является моим советом - читает хорошую книгу. Я рекомендую" Шаблоны C++ " Vandevoorde & Josuttis,

4
ответ дан 1 December 2019 в 06:16
поделиться

Шаблонный Совет дня: Сделал Вы знаете, что можно специализировать выбранные функции шаблонных инстанцирований:

#include <iostream>
#include <vector>

namespace std {
    template<>
    void vector<int>::clear() {
    std::cout << "Clearing..." << std::endl;
    resize(0);
    }
}

int main() {
    std::vector<int> v;
    v.push_back(1);
    v.clear();
}

ouputs: Очистка...

4
ответ дан 1 December 2019 в 06:16
поделиться

Одна частая ошибка состоит в том, что шаблонный конструктор или оператор присваивания не подавят сгенерированный тот компилятора:

template <typename T>
class A {
public:
  template <typename S>
  A(A<S> const &);

  template <typename S>
  A & operator=(A<S> const &);

private:
  int * i;
}; 

, Хотя эти функции похожи на конструктора копии и копируют оператор присваивания, компилятор не видит его тот путь и генерирует неявные версии так или иначе. Результат состоит в том, что любые действия, выполненные этими функциями (например, глубокая копия участника), не произойдут, когда объект будет скопирован или присвоен от того же типа:

void foo (A<int>);

void bar () {
  A<int> a1;
  foo (a1);   // Implicitly generated copy ctor called

  A<long> a2;
  foo (a2);   // Template ctor called.

  A<int> a3;
  a3 = a1;   // Implicitly generated copy assignment operator called

  a3 = a2;   // Template assignment operator called
}

причина этого поведения происходит из-за специального правила в разрешении перегрузки (13.3.3):

, Учитывая эти определения, жизнеспособный функциональный F1 определяется, чтобы быть лучшей функцией, чем другой жизнеспособный функциональный F2, если для всех аргументов i, ICSi (F1) не является худшей последовательностью преобразования, чем ICSi (F2), и затем

[...]

, — F1 является нешаблонной функцией, и F2 является специализацией шаблона функции, или, если не, что,

В примерах выше, разрешение перегрузки видит две функции с той же подписью, одна из которых является шаблоном. Не обрабатывают функцию по шаблону (неявно сгенерированный оператор присваивания конструктора/копии копии) победы, и назван - также.

4
ответ дан 1 December 2019 в 06:16
поделиться

STL является Вашим другом.

2
ответ дан 1 December 2019 в 06:16
поделиться

Вот некоторые правила:

  1. не пишут шаблонов, если Вы не пишете очень, очень универсальная библиотека (STL и Повышение являются двумя видными примерами).
  2. не инстанцируют никакого нетривиального шаблона слишком много раз. Инстанцирование огромных шаблонных классов является особенно излишеством. Необходимо рассмотреть использование наследования и полиморфизма (простой путь, я имею в виду, с помощью виртуальных функций).
  3. , Если Вы пишете какие-либо шаблоны, зная, когда использовать const, mutable и volatile, сохранит пользователей шаблона и время компиляции и время выполнения.
  4. при инстанцировании каких-либо шаблонов используйте хороший компилятор.
2
ответ дан 1 December 2019 в 06:16
поделиться

Эффективный STL Read Meyers и книги C++ и современный Дизайн C++ Alexandrescu.

Meyers даст Вам основы на легких ошибках сделать и как избежать их. Alexandrescu представляет Вас основанной на шаблоне модели программирования, которая должна иметь Вас спрашивающий, "Это действительно хорошая идея?" вся книга.

2
ответ дан 1 December 2019 в 06:16
поделиться

Я склонен использовать, обрабатывает довольно много по шаблону, чтобы избежать дублирования кода и увеличить безопасность посредством проверок компиляции.

В целом, это помогает думать при вводе о том, что компилятор собирается сделать, и как код будет сгенерирован для каждого типа.

Являющийся очень повторяющимся в разработке и создающий шаблонную сложность постепенно помогал мне предотвращение, впитывающее сообщения ошибки компиляции. Не забывайте сохранять простое (или насмешка) инстанцированием шаблона где-нибудь, иначе у Вас могли бы быть некоторые противные неожиданности при инстанцировании шаблона монстра впервые.

Наконец, когда нет никакого выхода, добираются для чтения этих сообщений ошибки компиляции! Они могли бы выглядеть довольно страшными сначала, но они действительно полезны. Возможно, при первом извлечении первого, копировании его в текстовом редакторе и том, чтобы заставлять он выглядеть симпатичным поможет привыканию им, и это быстро становится второй натурой для прочтения.

2
ответ дан 1 December 2019 в 06:16
поделиться

Важно понять раздельную компиляцию и возможность получающихся исполняемых увеличений размера. При инстанцировании шаблона с тем же типом в нескольких файлах C++ Вы воспроизведете тип многократно, по крайней мере, на некоторых компиляторах.

0
ответ дан 1 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: