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

Специализация метода темплейтного класса вложенного в темплейтный класс - C++

Восстановить пароль Регистрация
Другие темы раздела
OpenGL OpenGL, трехмерный график http://www.cyberforum.ru/cpp-beginners/thread1497375.html
Начинаю по чуть-чуть изучать программирование , попалась для меня немного странная задачка , нужно вывести график функции z=cos(r)/r , но при этом r=sqrt((x^2)*(y^2)). выдает много ошибок , прошу помощи в их исправление или советов. #include<openGL/gl.h> #include<Glut/glut.h> #include <math.h> #include <stdlib.h> float f(float x, float y , float r , float z) { return...
C++ Крестики-нолики - алгоритм для игры против ПК Смотрю, уже только ленивый не сделал. Собственно это я. Вчера сел, написал свои 200 строк какашкокода для любого поля с любым количеством требуемых чисел для победы по всем направлениям.. С победой пришлось повозиться, но все вышло. Собственно, куда смотреть в отношении алгоритма для игры против ПК? Очевидно, что рандом так себе играет. Пока есть следующий вариант: if Проверить возможность... http://www.cyberforum.ru/cpp-beginners/thread1497338.html
Запись двумерного массива в файл C++
В общем нужно записать двумерный массив в фаил, но что то ни как не получается. //magicQuad.h #ifndef MAGICQUAD_H #define MAGICQUAD_H #include <iostream> using std::cout; using std::endl; class magicQuad {
C++ OpenGL: Вывести значения двух функций
Пытаюсь разобраться с opengl , хотел вывести две функции , но выдает ошибку , подскажите как исправить. #include <iostream> #include<openGL/gl.h> #include<Glut/glut.h> void draw() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1, 0, 0);
C++ Работа с динамическими символьными массивами и строками переменной длины http://www.cyberforum.ru/cpp-beginners/thread1497312.html
Здравствуйте! НЕ могу решить проблему из-за которой программа летит коту под хвост) Задача программы в том, чтобы по заранее заданным в поле номерам считать файлы с именами схожей конструкции: file1.dat .... file230.dat. То есть при каждой следующей итерации имя файла меняется, с ним производятся действия он закрывается. Поэтому требуется создавать массив имени файла. Проблема в том, что при...
C++ Что такое __pragma(warning()) ? Вот код макроса: #define PTM_WARNING_DISABLE \ __pragma(warning( push )) \ __pragma(warning( disable : 4867 )) Что эти функции делают? И что это за функция __pragma? От ее определение нельзя посмотреть? подробнее

Показать сообщение отдельно
Vlad1slav
21 / 21 / 5
Регистрация: 16.09.2009
Сообщений: 111
12.07.2015, 11:48  [ТС]     Специализация метода темплейтного класса вложенного в темплейтный класс
DrOffset, абалдеть, и вправду работает)
Но к сожалению это не совсем то что мне нужно.

Мой класс B содержит порядка 10 методов и почти все они совпадают, но есть парочку, которые различаются. Специально для них и решил использовать темплейты со специальизациями.
Теперь чтобы объявить и определить их всех для случаев true и false, прийдётся продублировать код:
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
template <typename T1>
class A
{
public:  
  template <bool T2, typename = void>
  class B;
 
  template <typename Dummy>
  class B<true, Dummy>
  {
  public:
      void f1(); /* Do smg1 */
      void f2(); /* Do smg2 */
      void f3(); /* Do smg3 */
  };
 
  template <typename Dummy>
  class B<false, Dummy>
  {
  public:
      void f1(); /* Do smg1_else */
      void f2(); /* Do smg2 */
      void f3(); /* Do smg3 */
  };
};
//и затем дважды продублировать определения.
В конечном итоге можно тоже самое написать и без темплейтов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <typename T1>
class A
{
public:
  A() {}
   
  class B1
  {
  public:
      void f1(); /* Do smg1 */
      void f2(); /* Do smg2 */
      void f3(); /* Do smg3 */
  };
 
  class B2
  {
  public:
      void f1(); /* Do smg1_else */
      void f2(); /* Do smg2 */
      void f3(); /* Do smg3 */
  };
};
Хотелось бы всё общее определить без частичной спецификации, а методы, которые имеют различия - уже со спецификацией, приблизительно так:
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
template <typename T1>
class A
{
public:  
  template <bool T2, typename = void>
  class B  
  {
    public:
    void f2();
    void f3();
  };
 
  template <typename Dummy>
  class B<true, Dummy>
  {
    public:
    void f1();
  };
  
  template <typename Dummy>
  class B<false, Dummy>
  {
    public:
    void f1();
  };
};
 
template <typename T1>
template <typename Dummy>
void A<T1>::B<true, Dummy>::f1()
{  
}
 
template <typename T1>
template <typename Dummy>
void A<T1>::B<false, Dummy>::f1()
{  
}
 
template <typename T1>
template <bool T2, typename Dummy>
void A<T1>::B<T2, Dummy>::f2()
{
}
 
template <typename T1>
template <bool T2, typename Dummy>
void A<T1>::B<T2, Dummy>::f3()
{
}
 
int main()
{
    A<int>::B<true> b1;
    b1.f1();
    b1.f2(); // error: A<int>::B<true> has no member f2
    b1.f3(); // error: A<int>::B<true> has no member f3
    A<int>::B<false> b2;
    b2.f1();
    b2.f2(); // error: A<int>::B<false> has no member f2
    b2.f3(); // error: A<int>::B<false> has no member f3
}
http://rextester.com/ZKRHS10208

Я вообще понимаю, что тут иделально подходит полиморфизм, но если есть возможность избавиться от виртуальных функций - нужно ей пользоваться.

Раз такой код не компилиться, буду обходиться namespac'ами.

Если есть идеи как сделать это по другому - буду рад выслушать.

Добавлено через 1 час 5 минут
Как я сразу не догодался... Тут можно использовать Static polymorphism:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
template <typename T1>
struct A
{
  template<typename T2>
  struct BaseB
  {
    void f1();
    void f2();
    void f3();
  };
 
  struct B_true : BaseB<B_true>
  {
    void f1_impl();
  };
  
  struct B_false : BaseB<B_false>
  {
    void f1_impl();
  };
};
 
template <typename T1>
template<typename T2>
void A<T1>::BaseB<T2>::f1()
{
  static_cast<T2*>(this)->f1_impl();
}
 
template <typename T1>
template<typename T2>
void A<T1>::BaseB<T2>::f2()
{
  
}
 
template <typename T1>
template<typename T2>
void A<T1>::BaseB<T2>::f3()
{
  
}
 
template <typename T1>
void A<T1>::B_true::f1_impl()
{
  
}
 
template <typename T1>
void A<T1>::B_false::f1_impl()
{
  
}
 
int main()
{
  A<char>::B_true b_true;
  b_true.f1();
  b_true.f2();
  b_true.f3();
  
  A<char>::B_false b_false;
  b_false.f1();
  b_false.f2();
  b_false.f3();
}
http://rextester.com/XXWK48117

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