Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет yigal_s ([info]yigal_s)
@ 2011-09-30 01:31:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
C++ этюд. Функция, принимающая точный тип int. (преобразования типа запрещены)
template< typename T, typename TT >
class ErrorGenerator2
{
// const int errorGen=0; - this is underfined! :-)
};


template < typename T>
class ExactType
{
T mT;
public:
ExactType(T t)
: mT(t)
{}

template < typename TT >
ExactType(TT tt)
{
ErrorGenerator2< T, TT>::errorGen; // error generator: 2nd type is disallowed, use 1st only
}
T get()
{ return mT; }
};

void funcExact(ExactType< int > arg)
{

}
enum ESomeEnum { aaa};

void test()
{
funcExact(aaa);
short si=1;
funcExact(si);
}

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