#include <iostream>
template<int N>
struct NumWriter1 {
static void write() {
std::cout << "Передано число " << N << std::endl;
}
};
template<>
struct NumWriter1<0> {
static void write() {
std::cout << "Передан нолик" << std::endl;
}
};
template<int N1, int N2>
struct NumWriter2 {
static void write() {
std::cout << "Переданы числа " << N1 << " и " << N2 << std::endl;
}
};
template<int N2>
struct NumWriter2<0, N2> {
static void write() {
std::cout << "Передан нолик и число " << N2 << std::endl;
}
};
template<int N1>
struct NumWriter2<N1, 0> {
static void write() {
std::cout << "Передано число " << N1 << " и нолик" << std::endl;
}
};
// Если удалить специализацию ниже, то будет ошибка компиляции, потому что
// NumWriter2<0, 0>::write(); подходит как для специализации <0, N2>, так и
// для <N1, 0> и неясно какую выбирать.
template<>
struct NumWriter2<0, 0> {
static void write() {
std::cout << "Переданы два нолика" << std::endl;
}
};
int main() {
NumWriter1<10>::write();
NumWriter1<0>::write();
NumWriter2<0, 1>::write();
NumWriter2<0, 234>::write();
NumWriter2<2, 56>::write();
NumWriter2<2, 0>::write();
NumWriter2<0, 0>::write();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8aW50IE4+CnN0cnVjdCBOdW1Xcml0ZXIxIHsKICAgIHN0YXRpYyB2b2lkIHdyaXRlKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAi0J/QtdGA0LXQtNCw0L3QviDRh9C40YHQu9C+ICIgPDwgTiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBOdW1Xcml0ZXIxPDA+IHsKICAgIHN0YXRpYyB2b2lkIHdyaXRlKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAi0J/QtdGA0LXQtNCw0L0g0L3QvtC70LjQuiIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKdGVtcGxhdGU8aW50IE4xLCBpbnQgTjI+CnN0cnVjdCBOdW1Xcml0ZXIyIHsKICAgIHN0YXRpYyB2b2lkIHdyaXRlKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAi0J/QtdGA0LXQtNCw0L3RiyDRh9C40YHQu9CwICIgPDwgTjEgIDw8ICIg0LggIiA8PCBOMiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07Cgp0ZW1wbGF0ZTxpbnQgTjI+CnN0cnVjdCBOdW1Xcml0ZXIyPDAsIE4yPiB7CiAgICBzdGF0aWMgdm9pZCB3cml0ZSgpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgItCf0LXRgNC10LTQsNC9INC90L7Qu9C40Log0Lgg0YfQuNGB0LvQviAiIDw8IE4yIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCnRlbXBsYXRlPGludCBOMT4Kc3RydWN0IE51bVdyaXRlcjI8TjEsIDA+IHsKICAgIHN0YXRpYyB2b2lkIHdyaXRlKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAi0J/QtdGA0LXQtNCw0L3QviDRh9C40YHQu9C+ICIgPDwgTjEgPDwgIiDQuCDQvdC+0LvQuNC6IiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgovLyDQldGB0LvQuCDRg9C00LDQu9C40YLRjCDRgdC/0LXRhtC40LDQu9C40LfQsNGG0LjRjiDQvdC40LbQtSwg0YLQviDQsdGD0LTQtdGCINC+0YjQuNCx0LrQsCDQutC+0LzQv9C40LvRj9GG0LjQuCwg0L/QvtGC0L7QvNGDINGH0YLQvgovLyBOdW1Xcml0ZXIyPDAsIDA+Ojp3cml0ZSgpOyDQv9C+0LTRhdC+0LTQuNGCINC60LDQuiDQtNC70Y8g0YHQv9C10YbQuNCw0LvQuNC30LDRhtC40LggPDAsIE4yPiwg0YLQsNC6INC4IAovLyDQtNC70Y8gPE4xLCAwPiDQuCDQvdC10Y/RgdC90L4g0LrQsNC60YPRjiDQstGL0LHQuNGA0LDRgtGMLgp0ZW1wbGF0ZTw+CnN0cnVjdCBOdW1Xcml0ZXIyPDAsIDA+IHsKICAgIHN0YXRpYyB2b2lkIHdyaXRlKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAi0J/QtdGA0LXQtNCw0L3RiyDQtNCy0LAg0L3QvtC70LjQutCwIiA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgoKCmludCBtYWluKCkgewogICAgTnVtV3JpdGVyMTwxMD46OndyaXRlKCk7CiAgICBOdW1Xcml0ZXIxPDA+Ojp3cml0ZSgpOwoKICAgIE51bVdyaXRlcjI8MCwgMT46OndyaXRlKCk7CiAgICBOdW1Xcml0ZXIyPDAsIDIzND46OndyaXRlKCk7CiAgICBOdW1Xcml0ZXIyPDIsIDU2Pjo6d3JpdGUoKTsKICAgIE51bVdyaXRlcjI8MiwgMD46OndyaXRlKCk7CiAgICBOdW1Xcml0ZXIyPDAsIDA+Ojp3cml0ZSgpOwogICAgcmV0dXJuIDA7Cn0K