Szablony C++

0

Mam takie pytanie...
Piszę sobie menedżer pamięci w C++ i mam taki mały problem mianowicie chce wywołać konstruktor klasy bez przydzielania pamięci np.

...
T *AllocateSystemMemory(int nBytes);            // przydziela nBytes pamięci w wolnym miejscu
...

template <typename T1> T * NewSystemMemory(const T1 &v1) { T *Ptr = AllocateSystemMemory(sizeof(T)); return new (Ptr) T(v1); }
....

"T" to powinnien byc szablon jakiejś klasy. Czy można jakoś zrobić (jeśli tak to jak?) szablon dla nieznanej na tym etapie dowolnej klasy ? Te klasy będą pózniej definiowane i tworzone a pamięć bedzie im przydzielana za pomoca tego wlasnie menedżera, zapobiegając fragmentacji pamięci.

0

Jeśli NewSystemMemory to zwykła funkcja, to dodaj T do listy parametrów szablonu.

0

Dzieki za wskazówkę.

...
class Klasa                                 // jakas klasa
{
    public:
        Klasa(int i, float f);
}
...
Klasa *_klasa1;                          

...
// _klasa1 = new Klasa(5,3.2);                  zamiast takiego tworzenia obiektu ten ponizszy sposob
_klasa1 = MemoryManager::Instance()->NewSystemMemory(5, 3.2);   // MemoryManager to singleton
...

O coś takiego mi chodziło. Moze to bedzie działać.

0

Będzie działać, jeśli twój singleton to szablon. W przeciwnym wypadku kompilator nie wydedukuje o jaką klasę ci chodzi i wtedy musisz jawnie ją określić:

void* AllocateSystemMemory(int nBytes); 
...

template <typename T, typename A> T* NewSystemMemory(A &v1)
{
	void* ptr = AllocateSystemMemory(sizeof(T));
	return new (ptr) T(v1);
}

// wywołanie
string* p = MemoryManager::Instance()->NewSystemMemory<string>("abcd");
0

0x666 Dzieki wielkie za poswięcony czas i za rozwiazanie problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1