Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416

специализация шаблона

27.07.2013, 23:20. Показов 1947. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
начал разбираться с шаблонами. если есть структура, и одна функция именно с int должна работать по особенному, написать можно вот так.

C++ (Qt)
1
2
3
4
5
6
7
8
9
template <typename T>
struct A {
  ...
};
 
template <>
void A::func <int>(){
   ...
};
а если у меня структура вот такого плана

C++ (Qt)
1
2
3
4
template <typename T, int param>
struct A {
  ...
};
как мне написать специализацию шаблона функции для определенного типа (например int)?
спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.07.2013, 23:20
Ответы с готовыми решениями:

Специализация шаблона
Здравствуйте! Задача: Создайте шаблонную функцию maxn(), которая принимает в качестве аргумента массив элементов типа Т и целое...

Специализация шаблона
Пытаюсь специализировать шаблон для типа float, но не получается. В чем проблема? Компилятор: 1&gt;TemplateArr.obj : error LNK2005:...

Специализация шаблона
Всем доброго вечера! Возникает непонятная ошибка при создании специализации родового класса cl. В строке 10: template class...

19
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.07.2013, 00:10
Кликните здесь для просмотра всего текста

Не по теме:

не

Цитата Сообщение от no0ker Посмотреть сообщение
C++
1
2
3
4
template <>
void A::func <int>(){
...
};
а
C++
1
2
3
4
template <>
void A<int>::func() {
...
}



можно только так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template<class T, int N>
struct Foo
{
    void bar();
};
 
template<class T, int N>
void Foo<T, N>::bar()
{
 
}
 
template<int N>
struct Foo<int, N>
{
    void bar();
};
 
template<int N>
void Foo<int, N>::bar()
{
 
}
1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 10:01  [ТС]
а в функции

C++ (Qt)
1
2
3
4
5
template<class T, int N>
void Foo<T, N>::bar()
{
 
}
можно ли проверять тип T? мол, если число - то вот так. если строка - то вот так. как это реализовать?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.07.2013, 14:16
no0ker, делайте специализацию
1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 21:51  [ТС]
у меня еще вот такой вопрос...
есть вот такой шаблон
template<class T, int N>
C++ (Qt)
1
2
3
4
struct Foo
{
    void bar();
};
и помимо функции void bar(); ведь есть еще много других функций.

мне нужно, чтобы только одна функция класса с int работала несколько иначе и напишу
C++ (Qt)
1
2
3
4
5
template<int N>
struct Foo<int, N>
{
    void bar();
};
а остальные функции? они будут "там"? то есть я описываю только "исключительный" случай с int?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
28.07.2013, 21:59
no0ker, нет.

Добавлено через 18 секунд
Цитата Сообщение от no0ker Посмотреть сообщение
то есть я описываю только "исключительный" случай с int?
да.
1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 22:26  [ТС]
то есть, допустим есть

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
template<class T, int N>
struct Foo
{
    void bar();
    void abb();
};
 
template<class T, int N>
void Foo<T, N>::bar()
{
 
}


C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
template<int N>
struct Foo<int, N>
{
    void bar();
    // void abb(); нужно ли ее сюда писать?
};
 
template<int N>
void Foo<int, N>::bar()
{
 
}
могу ли я обратиться вот так?

C++ (Qt)
1
2
foo<int, 1> test;
test.abb() // можно ли вызывать функцию abb из специализированного класса?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.07.2013, 22:34
no0ker, Нужно. Если в специализации данной функции нет - вызвать ее нельзя.
1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 22:48  [ТС]
тогда если у меня есть 30 функций в классе, допустим. и только одну нужно подправить для int. получается что все 30 функций я просто копи-пастю, а только 1 немножко переписываю? =( это как то.. нерационально получается что ли... неужели нет другого способа? =(
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.07.2013, 22:49
no0ker, Есть. И не один.
0
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 22:53  [ТС]
а поподробнее можно? =)
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
29.07.2013, 00:08
no0ker, можно общий функционал вынести в базовый класс, примерно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<typename T, int param>
struct FooBase {
 
   void abb() { /* ... */ }
};
 
template<typename T, int param>
struct Foo : FooBase<T, param> {
 
   void foo() { /* ... */ }
};
 
template<int param>
struct Foo<int, param> : FooBase<int, param> {
 
   void foo() { /* ... */ }
};
1
 Аватар для ninja2
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
29.07.2013, 02:49
Цитата Сообщение от no0ker Посмотреть сообщение
можно ли проверять тип T? мол, если число - то вот так. если строка - то вот так. как это реализовать?
Просто перегрузи функцию void F(string); и void F(int);
1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 17:26  [ТС]
начал писать, но вот этот код категорически не компилится

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T, int L>
struct parent{
public:
    void test(void){
        std::cout << "parent -> " << L << "\n";
    }
};
 
template<int L>
struct child <int, L> :  parent <int, L>{
    
};
мол, синтаксическая ошибка. подскажите как поправить, пожалуйста.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
11.08.2013, 17:27
no0ker, Что сделать-то хотите? У вас нет специализации.
0
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 17:33  [ТС]
ну, я хотел сделать что то такое

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template<typename T, int L>
struct parent{
public:
    // куча общих функций
};
 
template<int L>
struct child <int, L> : public parent <int, L>{
    void test(void){
        // одна реализация функции тест
    }
};
 
template<int L>
struct child <char, L> : public  parent <char, L>{
    void test(void){
        // другая реализация функции тест
    }
};
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
11.08.2013, 17:36
no0ker, чтобы специализировать шаблон, нужен сам шаблон.
C++
1
2
3
4
5
6
7
8
template<typename, int>
struct child;
 
template<int L>
struct child<int, L> ...
 
template<int L>
struct child<char, L> ...
1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 17:43  [ТС]
не понял.
у меня есть шаблон. у него есть много-много функций. но есть одна вредная функция, которая зависит от параметра шаблона. если я буду писать специализации шаблонов, мне придется тупо копировать-вставлять все общие функции и изменять только одну вредную функцию.

а я хотел сделать шаблон предок с общими функциями. и наследовать от него шаблончики, в которых будет описана только эта одна вредная функция. это возможно сделать?
0
What a waste!
 Аватар для gray_fox
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
11.08.2013, 17:53
Цитата Сообщение от no0ker Посмотреть сообщение
я хотел сделать шаблон предок с общими функциями. и наследовать от него шаблончики, в которых будет описана только эта одна вредная функция. это возможно сделать?
можно, например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
 
 
template<typename, int Value>
struct parent {
 
   void foo() const {
      std::clog << "parent: " << Value << std::endl;
   }
};
 
template<typename, int>
struct child;
 
template<int Value>
struct child<int, Value> : parent<int, Value> {
 
   void bar() const {
      this->foo();
      std::clog << "child: int, " << Value << std::endl;
   }
};
 
template<int Value>
struct child<char, Value> : parent<char, Value> {
 
   void bar() const {
      this->foo();
      std::clog << "child: char, " << Value << std::endl;
   }
};
 
 
int main() {
   child<int, 1>().bar();
   child<char, 2>().bar();
}
http://ideone.com/yoWDrt
Цитата Сообщение от no0ker Посмотреть сообщение
не понял.
Ты написал специализацию для несуществуещего шаблона класса child.
1
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 19:17  [ТС]
да действительно работает. круто круто круто.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.08.2013, 19:17
Помогаю со студенческими работами здесь

специализация шаблона
Добрый день! Хотелось бы сделать шаблонную функцию, у которой будет различная реализация в зависимости от того является ли шаблонный...

Специализация шаблона
Привет, у меня есть вот такой шаблон дерева: template &lt;typename T = int&gt; class Tree{ struct TreeItem{ // элемент дерева ...

Явная специализация шаблона
Здравствуйте. Не совсем разобрася с сабжем. Например, если есть кусочек кода: template &lt;typename T&gt; void func(T &amp;blue, T...

Явная специализация шаблона
Добрый день. Подскажите пожалуйста, почему запускается шаблонная функция а не явная специализация? Если вместо массива указателей на...

Специализация шаблона функции
Допустим у нас имеется шаблон функции такой, в угловых скобках которого содержатся как типовые параметры (с ударением на букве И), так и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru