Проблема шаблона C ++ - PullRequest
       1

Проблема шаблона C ++

0 голосов
/ 09 февраля 2011

Я хотел бы реализовать базовый класс с атрибутами размера, которые я уже знаю во время компиляции. Поэтому моя идея заключалась в том, чтобы использовать шаблон для этого базового класса. Следующий код компилируется и прекрасно работает под VC ++ 9.0.

Определение класса в файле .h

template<int N> class BaseClass
{
int* idx; 
int* incr; 
int* limit;


public:
BaseClass(void);
~BaseClass(void);

void LoopMethod(void);

};

Реализация методов класса в файле .cpp

#include "BaseClass.h"
#include<iostream>

using namespace std;

 // instantiation
 template class BaseClass<2>;


template<int N> BaseClass<N>::BaseClass(void)
{
idx = new int [N];
incr= new int [N];
limit = new int[N];

for(int m = 0; m < N; m++)
{
    idx[m] = 0;
    incr[m] = 1;
    limit[m] = 2;
}

}

template<int N> BaseClass<N>::~BaseClass(void)
{
}


template<int N> void BaseClass<N>::LoopMethod( )
{   
for( idx[N-1]; idx[N-1] < limit[N-1]; idx[N-1] += incr[N-1] )
{
    cout << "LoopMethod Nr " << N-1 << " is called." << endl;
}

}

Реализация основной функции:

#include<cstdlib>
#include "BaseClass.h"

using namespace std;


int main()
{
BaseClass<2> baseObj;

baseObj.LoopMethod();


system("PAUSE");
return 0;

}

Теперь я хочу вложить циклы for в LoopMethod, умноженные на размер атрибутов класса. То есть компилятор должен сгенерировать код, который я написал бы от руки как

 template<int N> void BaseClass<N>::LoopMethod( )
 {
for( idx[0]; idx[0] < limit[0]; idx[0] += incr[0] )
{   
    for( idx[1]; idx[1] < limit[1]; idx[1] += incr[1] )
    {
        cout << "LoopMethod Nr " << 1 << " is called." << endl;
    }

    cout << "LoopMethod Nr " << 0 << " is called." << endl;

}
 }

В любом случае, я могу предложить компилятору сделать это, если я не объявлю BaseClass классом шаблона. Код для этого будет выглядеть так:

 class BaseClass
 {


int* idx; 
int* incr; 
int* limit;


public:
BaseClass(void);
~BaseClass(void);

template<int M> void LoopMethod(void);


 };

Реализация методов класса в файле .cpp

#include "BaseClass.h"
#include<iostream>

using namespace std;

template void BaseClass::LoopMethod<1>();           

BaseClass::BaseClass(void)
{
idx = new int [2];
incr= new int [2];
limit = new int[2];

for(int m = 0; m < 2; m++)
{
    idx[m] = 0;
    incr[m] = 1;
    limit[m] = 2;
}

}

BaseClass::~BaseClass(void)
{
}

template<int M> void BaseClass::LoopMethod( )
{
for( idx[M]; idx[M] < limit[M]; idx[M] += incr[M] )
{
    cout << "LoopMethod Nr " << M-1 << " is called." << endl;
    LoopMethod<M-1>();

}
}

template<> void BaseClass::LoopMethod<0>(void)
{
idx[0] = 0;

for( idx[0]; idx[0] < limit[0]; idx[0] += incr[0] )
{
    // do something
    cout << "Now the inner loop is executed" << endl;

}

 }

Реализация основной функции:

#include<cstdlib>
#include "BaseClass.h"

using namespace std;


int main()
{
BaseClass baseObj;

baseObj.LoopMethod<1>();


system("PAUSE");
return 0;
 }

Но решение, которое я ищу, состоит в том, чтобы иметь шаблонный класс с шаблонным методом «LoopMethod», имеющим собственный параметр шаблона, который сообщает компилятору, сколько раз вложить в цикл for-Loop. Я пробовал разные возможности, но безуспешно. У кого-нибудь есть предложение или даже известно решение для этой проблемы шаблона?

Заранее спасибо за помощь,

Маркус.

Ответы [ 2 ]

5 голосов
/ 09 февраля 2011

Есть много проблем с вашим шаблоном:

  • Какова цель всего этого?
  • Почему вы инициализируете указатели новыми?Вы знаете размер во время компиляции, так почему бы просто не сделать их массивами?
  • Вы не удаляете память, которую выделяете
  • Исключительная безопасность, если новая ошибка для одного из последующих массивов
  • Реализация, вероятно, должна быть в заголовочном файле, если только он не используется для очень немногих значений N, которые вы создаете
  • Лучше использовать существующие классы, которые делают подобные вещи, например boost :: array
  • Рефакторинг различных его частей.
0 голосов
/ 09 февраля 2011

Но решение, которое я ищу, состоит в том, чтобы иметь шаблонный класс с шаблонным методом «LoopMethod» благодаря собственному параметру шаблона, который сообщает компилятору, сколько раз вкладывать цикл for-Loop

Это то, что вы спрашиваете:

template<int N>
struct X
{
    template<int M>
    void loop();
};

template<int N>
template<int M>
void X<N>::loop<M>()
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...