Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
27.07.2013, 23:20     специализация шаблона #1
начал разбираться с шаблонами. если есть структура, и одна функция именно с 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)?
спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 23:20     специализация шаблона
Посмотрите здесь:

Частичная специализация шаблона C++
C++ Специализация шаблона
C++ специализация шаблона функции
Явная специализация шаблона C++
Специализация шаблона C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 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()
{
 
}
no0ker
100 / 87 / 4
Регистрация: 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? мол, если число - то вот так. если строка - то вот так. как это реализовать?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.07.2013, 14:16     специализация шаблона #4
no0ker, делайте специализацию
no0ker
100 / 87 / 4
Регистрация: 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?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
28.07.2013, 21:59     специализация шаблона #6
no0ker, нет.

Добавлено через 18 секунд
Цитата Сообщение от no0ker Посмотреть сообщение
то есть я описываю только "исключительный" случай с int?
да.
no0ker
100 / 87 / 4
Регистрация: 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 из специализированного класса?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.07.2013, 22:34     специализация шаблона #8
no0ker, Нужно. Если в специализации данной функции нет - вызвать ее нельзя.
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 22:48  [ТС]     специализация шаблона #9
тогда если у меня есть 30 функций в классе, допустим. и только одну нужно подправить для int. получается что все 30 функций я просто копи-пастю, а только 1 немножко переписываю? =( это как то.. нерационально получается что ли... неужели нет другого способа? =(
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.07.2013, 22:49     специализация шаблона #10
no0ker, Есть. И не один.
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
28.07.2013, 22:53  [ТС]     специализация шаблона #11
а поподробнее можно? =)
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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() { /* ... */ }
};
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
29.07.2013, 02:49     специализация шаблона #13
Цитата Сообщение от no0ker Посмотреть сообщение
можно ли проверять тип T? мол, если число - то вот так. если строка - то вот так. как это реализовать?
Просто перегрузи функцию void F(string); и void F(int);
no0ker
100 / 87 / 4
Регистрация: 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>{
    
};
мол, синтаксическая ошибка. подскажите как поправить, пожалуйста.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.08.2013, 17:27     специализация шаблона #15
no0ker, Что сделать-то хотите? У вас нет специализации.
no0ker
100 / 87 / 4
Регистрация: 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){
        // другая реализация функции тест
    }
};
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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> ...
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 17:43  [ТС]     специализация шаблона #18
не понял.
у меня есть шаблон. у него есть много-много функций. но есть одна вредная функция, которая зависит от параметра шаблона. если я буду писать специализации шаблонов, мне придется тупо копировать-вставлять все общие функции и изменять только одну вредную функцию.

а я хотел сделать шаблон предок с общими функциями. и наследовать от него шаблончики, в которых будет описана только эта одна вредная функция. это возможно сделать?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2013, 19:17     специализация шаблона
Еще ссылки по теме:

C++ Специализация операции шаблона
Явная специализация шаблона C++
C++ Специализация шаблона

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

Или воспользуйтесь поиском по форуму:
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
11.08.2013, 19:17  [ТС]     специализация шаблона #20
да действительно работает. круто круто круто.
Yandex
Объявления
11.08.2013, 19:17     специализация шаблона
Ответ Создать тему
Опции темы

Текущее время: 05:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru