Если я понимаю вас правильно, вот что вы хотите.
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'
От [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
Это не может быть популярно, но я думаю, что это должно быть сказано.
Шаблоны являются сложными.
Они удивительно мощны, но используют их мудро. Не также сходите с ума, не имейте слишком многих аргументов шаблона... Не имейте слишком многих специализаций... Помните, другие программисты должны считать это также.
И больше всего, держитесь подальше от шаблонного метапрограммирования...
Я должен был бы сказать, что Coplien Любопытно повторяющийся шаблонный шаблон (CRTP) является одним шаблонным приемом, которого я достигаю по & снова. По существу это позволяет Вам вводить статически настроенную функциональность в производный класс путем наследования базовому классу, который параметризован на имени производного класса. Следите за испугом, но удивительно полезный (некоторый вызов это статический полиморфизм).
кроме того, я буду совет второго Neil Butterworth считать "Шаблоны C++" и добавить Alexandrescu современный Дизайн .
C++Этот вопрос немного похож, "я собираюсь реализовать большую часть своей библиотеки с помощью функций, каковы частые ошибки в использовании функций?" Это твердо придумать разумные ответы на такие вопросы, но здесь является моим советом - читает хорошую книгу. Я рекомендую" Шаблоны C++ " Vandevoorde & Josuttis,
Шаблонный Совет дня: Сделал Вы знаете, что можно специализировать выбранные функции шаблонных инстанцирований:
#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: Очистка...
Одна частая ошибка состоит в том, что шаблонный конструктор или оператор присваивания не подавят сгенерированный тот компилятора:
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 является специализацией шаблона функции, или, если не, что,
В примерах выше, разрешение перегрузки видит две функции с той же подписью, одна из которых является шаблоном. Не обрабатывают функцию по шаблону (неявно сгенерированный оператор присваивания конструктора/копии копии) победы, и назван - также.
Вот некоторые правила:
const
, mutable
и volatile
, сохранит пользователей шаблона и время компиляции и время выполнения. Эффективный STL Read Meyers и книги C++ и современный Дизайн C++ Alexandrescu.
Meyers даст Вам основы на легких ошибках сделать и как избежать их. Alexandrescu представляет Вас основанной на шаблоне модели программирования, которая должна иметь Вас спрашивающий, "Это действительно хорошая идея?" вся книга.
Я склонен использовать, обрабатывает довольно много по шаблону, чтобы избежать дублирования кода и увеличить безопасность посредством проверок компиляции.
В целом, это помогает думать при вводе о том, что компилятор собирается сделать, и как код будет сгенерирован для каждого типа.
Являющийся очень повторяющимся в разработке и создающий шаблонную сложность постепенно помогал мне предотвращение, впитывающее сообщения ошибки компиляции. Не забывайте сохранять простое (или насмешка) инстанцированием шаблона где-нибудь, иначе у Вас могли бы быть некоторые противные неожиданности при инстанцировании шаблона монстра впервые.
Наконец, когда нет никакого выхода, добираются для чтения этих сообщений ошибки компиляции! Они могли бы выглядеть довольно страшными сначала, но они действительно полезны. Возможно, при первом извлечении первого, копировании его в текстовом редакторе и том, чтобы заставлять он выглядеть симпатичным поможет привыканию им, и это быстро становится второй натурой для прочтения.
Важно понять раздельную компиляцию и возможность получающихся исполняемых увеличений размера. При инстанцировании шаблона с тем же типом в нескольких файлах C++ Вы воспроизведете тип многократно, по крайней мере, на некоторых компиляторах.