Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование шаблонов, ....лучше название не придумал 
:(
    Опции темы
Lazin
  Дата 11.1.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



В общем проблема следующая
есть шаблонная функция
Код

template<typename T>
void generic_fn()
{
    ///..сдесь используется тип T
}


тип который подставляется в этот шаблон то-же не так прост...
Код

template <typename T, int n>
struct generic_type
{
   typedef typename ...... Type;
};


для того что бы вызвать ф-ю нуно написать:
Код


generic_fn< generic_type<another_type, 0>::Type >();


нельзя ли как-нибудь упростить запись ?

Код

template<int index>
typedef typename generic_type<another_type, index>::Type Type;


а потом использовать во так:

Код

generic_fn< Type<0> >();
generic_fn< Type<1> >();
generic_fn< Type<2> >();


но это увы невозможно.... противоречит стандарту ;)
как можно поступить в этой ситуации?

Это сообщение отредактировал(а) Lazin - 11.1.2008, 14:25
PM MAIL Skype GTalk   Вверх
Alek86
Дата 11.1.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



ничего умнее наследования не придумал

Код

class CType {};

typedef CType another_type;

template<typename T>
void generic_fn()
  {
  ///..сдесь используется тип T
  }
template <typename T, int n>
struct generic_type {
  typedef T Type;
};

template <int n>
struct Type : public generic_type<another_type, n>::Type {};

int main()
  {
  generic_fn< generic_type<another_type, 0>::Type >();
  generic_fn< Type<0> >();
  }



отследить, что от another_type нельзя наследоваться, можно.
как - описано в книге "Шаблоны C++" (там немало кода, но он собран в библиотеку)


если another_type любой, то умнее\
Код

template <int n>
struct Type {
  typedef typename generic_type<another_type, n>::Type member;
  };

я не придумал


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 11.1.2008, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Самое универсальное решение такого:
Код

template< int index >
struct helper
{
    typedef typename generic_type<another_type, index>::Type type;
};

generic_fn< helper<0>::type >();


Добавлено через 1 минуту и 16 секунд
Цитата(Alek86 @  11.1.2008,  14:45 Найти цитируемый пост)
ничего умнее наследования не придумал

С наследованием проблема в том, что, как минимум нужно продублировать конструкторы...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 11.1.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(archimed7592 @  11.1.2008,  14:47 Найти цитируемый пост)
С наследованием проблема в том, что, как минимум нужно продублировать конструкторы...


точно


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 11.1.2008, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



так и думал, что придется еще один что-то подобное городить... не хочется, но придется.
кстати boost::mpl кто-нибудь юзает?
PM MAIL Skype GTalk   Вверх
Alek86
Дата 11.1.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



а вот так?

Код

template <int n>
struct Type {
  operator typename generic_type<another_type, n>::Type();
  };



--------------------
user posted image    user posted image
PM MAIL   Вверх
Earnest
Дата 11.1.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



А я бы макрос нарисовала. Что-то вроде:
Код

#define GenericFunc(N) generic_fn<generic_type<another_type, N>::Type >()

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




--------------------
...
PM   Вверх
Lazin
Дата 11.1.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



я то-же сначала макрос нарисовал, но с шаблоном получилось не хуже))
сделал примерно так
Цитата(archimed7592 @  11.1.2008,  14:47 Найти цитируемый пост)
Код

generic_fn< helper<0>::type >();

только оприделил класс внутри ф-ии
PM MAIL Skype GTalk   Вверх
Alek86
Дата 11.1.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



а шапками можно?

просто поинтересуюсь - а зачем использовать дефайны, когда можно обойтись без них? из-за лени? smile

Добавлено через 2 минуты и 19 секунд
 smile 
а моим способом не надо ::type писать...


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 11.1.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Alek86 @  11.1.2008,  16:52 Найти цитируемый пост)
а моим способом не надо ::type писать... 

но твой случай в моем случае не подходит, потому-что у меня этот шаблон раскрывается в один из POD типов, и потом передается в std::numeric_limits<T> .
компилятор не смотрит на оператор приведения типа, и пытается инстанциировать шаблон типом Type 
PM MAIL Skype GTalk   Вверх
Alek86
Дата 11.1.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



можно примерчик небольшой?
вроде ж, компилятор обязан просматривать все приведения типа


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 11.1.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



передается в качестве шаблонного параметра Т
Код

    template <typename T, typename state_t>
    bool try_to_set_format(const state_t value, parameter_packer_format_t& format)
    {
        if ( (static_cast<state_t>(std::numeric_limits<T>::min()) <= value) and
             (value <= static_cast<state_t>(std::numeric_limits<T>::max())) )
        {
            format( sizeof(T) );
            return true;
        }
        return false;
    }

template <int n>
struct format_t {
    typedef typename type_at_t<pktime_types, n>::Type type;
}; 

try_to_set_format< format_t<0>::type >(diff, format);


PM MAIL Skype GTalk   Вверх
Alek86
Дата 11.1.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



и что, если поменять код (соответственно):

Код

template <int n>
struct format_t {
  operator typename generic_type<another_type, n>::Type ();
  }; 

и
Код

try_to_set_format< format_t<0> >(diff, format);


это не компилируется?


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 11.1.2008, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



нет, не компилируется, 
код
type_at_t<pktime_types, n>::Type
обычно преобразуется в один из простых типов, int char и тд.
PM MAIL Skype GTalk   Вверх
Cycle
Дата 13.1.2008, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 1.12.2007

Репутация: 3
Всего: 3



Вроде в новом стандарте С++0х такое уже должно компилится.
Код

template<int index>
typedef typename generic_type<another_type, index>::Type Type;

И вроде в последний gcc включено реализация черновика С++0х. У кого есть такой компилятор (и кто знает с каким ключем нужно компилить) проверте плз. 
P.S. Я понимаю, что автору топика может не к месту использовать gcc по Linux smile Мне просто интересно, можно ли будет так писать в будущем, которое уже не за горами.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0594 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.