Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
#1

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

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

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

http://www.cyberforum.ru/cpp-beginners/thread788548.html
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 23:20
Я подобрал для вас темы с готовыми решениями и ответами на вопрос специализация шаблона (C++):

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

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

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

Явная специализация шаблона
Здравствуйте, подскажите, пожалуйста, почему не выполняется неявное приведение...

Явная специализация шаблона
Здравствуйте. Не совсем разобрася с сабжем. Например, если есть кусочек кода:...

19
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.07.2013, 00:10 #2
Кликните здесь для просмотра всего текста

Не по теме:

не

Цитата Сообщение от 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
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 10:01  [ТС] #3
а в функции

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

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

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
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.07.2013, 22:34 #8
no0ker, Нужно. Если в специализации данной функции нет - вызвать ее нельзя.
1
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 22:48  [ТС] #9
тогда если у меня есть 30 функций в классе, допустим. и только одну нужно подправить для int. получается что все 30 функций я просто копи-пастю, а только 1 немножко переписываю? =( это как то.. нерационально получается что ли... неужели нет другого способа? =(
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
28.07.2013, 22:49 #10
no0ker, Есть. И не один.
0
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 22:53  [ТС] #11
а поподробнее можно? =)
0
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
29.07.2013, 00:08 #12
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
969 / 188 / 32
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
29.07.2013, 02:49 #13
Цитата Сообщение от no0ker Посмотреть сообщение
можно ли проверять тип T? мол, если число - то вот так. если строка - то вот так. как это реализовать?
Просто перегрузи функцию void F(string); и void F(int);
1
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 17:26  [ТС] #14
начал писать, но вот этот код категорически не компилится

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
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.08.2013, 17:27 #15
no0ker, Что сделать-то хотите? У вас нет специализации.
0
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 17:33  [ТС] #16
ну, я хотел сделать что то такое

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
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
11.08.2013, 17:36 #17
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
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 17:43  [ТС] #18
не понял.
у меня есть шаблон. у него есть много-много функций. но есть одна вредная функция, которая зависит от параметра шаблона. если я буду писать специализации шаблонов, мне придется тупо копировать-вставлять все общие функции и изменять только одну вредную функцию.

а я хотел сделать шаблон предок с общими функциями. и наследовать от него шаблончики, в которых будет описана только эта одна вредная функция. это возможно сделать?
0
gray_fox
What a waste!
1552 / 1257 / 165
Регистрация: 21.04.2012
Сообщений: 2,634
Завершенные тесты: 3
11.08.2013, 17:53 #19
Цитата Сообщение от 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
no0ker
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 19:17  [ТС] #20
да действительно работает. круто круто круто.
0
11.08.2013, 19:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2013, 19:17
Привет! Вот еще темы с решениями:

Специализация шаблона функции
Как сделать специализированную функцию шаблон на тип int? У меня что-то не...

Частичная специализация шаблона
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть...

Частичная специализация шаблона
Может кто объяснить частичную специализацию и принцип её работы? По этой теме...

Явная специализация шаблона
Столкнулся с проблемой при изучении шаблонов. Задача: написать шаблонную...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru