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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель на шаблонную функцию, Возможно ли создать указатель на шаблон? 
V
    Опции темы
yorm
Дата 31.1.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Поскольку в c++ существует возможность создать указатель на функцию, у меня возник вопрос: а возможно ли создать указатель на шаблон?
Допустим, есть некая функция:
Код

template <class TTT> TTT ttt(TTT v) {
    return v;
}

хочется иметь на нее указатель (а даже лучше массив указателей на такие функции) и работать с ними.
Решил таким образом:
Код

    ...
    // Тест темплета
    cout << "Шаблон ttt<int>: " << ttt<int>(10) << endl;
    cout << "Шаблон ttt<char>: " << ttt<char>('K') << endl;
    int (*ptt)(int v); // Создаем указатель на шаблон ! ! ! ! ! !    
    ptt = ttt; // Присваеваем указателю шаблон ttt<int>
    char (*ptt2)(char v); // Создаем указатель на шаблон ! ! ! ! ! !    
    ptt2 = ttt; // Присваеваем указателю шаблон ttt<char>
    cout << "Работа указателя на шаблон ttt<int>: " << (*ptt)(10) << endl;
    cout << "Работа указателя на шаблон ttt<char>: " << (*ptt2)('K') << endl;
    ...

Код работает, но я так понял, что создал указатели на конкретные реализации шаблона? Есть ли возможность передавать указателю еще и класс, который будет подставляться в TTT?
PM MAIL   Вверх
threef
Дата 31.1.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

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



Это страшная штука. Закончится очередным вариантом MFC с их RUNTIME_CLASS  smile 
PM MAIL   Вверх
archimed7592
Дата 31.1.2008, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(yorm @  31.1.2008,  20:52 Найти цитируемый пост)
Есть ли возможность передавать указателю еще и класс, который будет подставляться в TTT? 

Нет, нельзя. Подобное можно вытворять с .NET/Java "шаблонами"(дженериками, если быть точнее).


--------------------
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   Вверх
maxim1000
Дата 1.2.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

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



класс передавать нельзя, но ведь обычно работа идёт не с классами, а с объектами классов и операциями, с ними связанными
так вот можно сделать общий базовый класс, а от него отнаследовать шаблонный класс
нужные операции (например, создание объекта, возможно, другие операции) реализовать в виде виртуальных методов


--------------------
qqq
PM WWW   Вверх
yorm
Дата 11.2.2008, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Понятно...

Спасибо за консультацию
PM MAIL   Вверх
Pashik
Дата 1.7.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

template <class TTT> TTT ttt(TTT v) {
    return v;
}

template <class T, T (*func)(T)>
struct FFF
{
    static T fff(T v) { return func(v); }
};

void test()
{
    FFF<int, ttt>::fff(10);
}

PM MAIL   Вверх
Pashik
Дата 1.7.2008, 19:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если нужно сохранять указатель, можно обернуть, например, так:
Код

template <class T>
class FuncObject
{
public:
    typedef T (*FuncType)(T);

    FuncObject(FuncType f): func(f) {}
    T operator()(T value) { return func(value); }

private:
    FuncType func;
};

void test()
{
    FuncObject<int> f(ttt);
    f(10);
}


Исследуй и используй хорошие библиотеки, типа boost, там таких заманух навалом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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