#include <iostream>
using namespace std;
//прототипы шаблонов
template <typename T> void counts();
template <typename T> void report(T &);
//шаблонный класс
template <typename TT>
class HasFriendT
{
private:
TT item;
static int ct;
public:
HasFriendT(const TT & i) : item(i) {ct++;}
~HasFriendT( ) {ct--;}
friend void counts<TT>();
friend void report<>(HasFriendT<TT> &);
};
template <typename T>
int HasFriendT<T>::ct = 0;
//определение дружественных функции для шаблона
template <typename T>
void counts()
{
cout << "template size: " << sizeof(HasFriendT<T>) << "; "; //размер шаблона
cout << "template counts(): " << HasFriendT<T>::ct << endl;
}
template <typename T>
void report(T & hf)
{
cout << hf.item << endl;
}
int main()
{
counts<int>();
HasFriendT<int> hfi1(10);
HasFriendT<int> hfi2(20);
HasFriendT<double> hfdb(10.5);
report(hfi1);
report(hfi2);
report(hfdb);
cout << "counts<int>() output:\n";
counts<int>();
cout << "counts<double> ( ) output: \n";
counts<double>();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy/Qv9GA0L7RgtC+0YLQuNC/0Ysg0YjQsNCx0LvQvtC90L7Qsgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb3VudHMoKTsKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcmVwb3J0KFQgJik7CgovL9GI0LDQsdC70L7QvdC90YvQuSDQutC70LDRgdGBCnRlbXBsYXRlIDx0eXBlbmFtZSBUVD4KY2xhc3MgSGFzRnJpZW5kVAp7Cglwcml2YXRlOgoJICAgVFQgaXRlbTsKCSAgIHN0YXRpYyBpbnQgY3Q7CglwdWJsaWM6CgkgICBIYXNGcmllbmRUKGNvbnN0IFRUICYgaSkgOiBpdGVtKGkpIHtjdCsrO30KCSAgIH5IYXNGcmllbmRUKCApIHtjdC0tO30KCSAgIGZyaWVuZCB2b2lkIGNvdW50czxUVD4oKTsKCSAgIGZyaWVuZCB2b2lkIHJlcG9ydDw+KEhhc0ZyaWVuZFQ8VFQ+ICYpOwp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KaW50IEhhc0ZyaWVuZFQ8VD46OmN0ID0gMDsKCi8v0L7Qv9GA0LXQtNC10LvQtdC90LjQtSDQtNGA0YPQttC10YHRgtCy0LXQvdC90YvRhSDRhNGD0L3QutGG0LjQuCDQtNC70Y8g0YjQsNCx0LvQvtC90LAKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgY291bnRzKCkKewoJY291dCA8PCAidGVtcGxhdGUgc2l6ZTogIiA8PCBzaXplb2YoSGFzRnJpZW5kVDxUPikgPDwgIjsgIjsgLy/RgNCw0LfQvNC10YAg0YjQsNCx0LvQvtC90LAKCWNvdXQgPDwgInRlbXBsYXRlIGNvdW50cygpOiAiIDw8IEhhc0ZyaWVuZFQ8VD46OmN0IDw8IGVuZGw7Cn0KdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgcmVwb3J0KFQgJiBoZikKewoJY291dCA8PCBoZi5pdGVtIDw8IGVuZGw7Cn0KCmludCBtYWluKCkKewoJY291bnRzPGludD4oKTsKCUhhc0ZyaWVuZFQ8aW50PiBoZmkxKDEwKTsKCUhhc0ZyaWVuZFQ8aW50PiBoZmkyKDIwKTsKCUhhc0ZyaWVuZFQ8ZG91YmxlPiBoZmRiKDEwLjUpOwoJcmVwb3J0KGhmaTEpOwoJcmVwb3J0KGhmaTIpOwoJcmVwb3J0KGhmZGIpOwoJY291dCA8PCAiY291bnRzPGludD4oKSBvdXRwdXQ6XG4iOwoJY291bnRzPGludD4oKTsKCWNvdXQgPDwgImNvdW50czxkb3VibGU+ICggKSBvdXRwdXQ6IFxuIjsKCWNvdW50czxkb3VibGU+KCk7CglyZXR1cm4gMDsKfQo=