Ograniczanie parametru szablonu klasy

0

Witam.

Mam następujący problem. Napisałem szablon klasy, w którym jako parametr podaje się typ niektórych zmiennych wewnątrz klasy. Czy jest możliwość żeby jakoś ograniczyć ten typ? To znaczy, żeby potem jako parametr można było podać powiedzmy tylko int i double?

Czyli poprawne byłoby coś takiego:
Klasa<int> obiekt1;
Klasa<double> obiekt 2;

A nie można byłoby utworzyć obiektu takiego:
Klasa<char> obiekt3;

0

Mogę się mylić ale wydaje mi się, że jedynym sensownym rozwiązaniem jest tutaj specjalizacja szablonu klasy. Tzn. ja jeśli już musiałbym coś takiego zrobić, to zrobiłbym wyspecjalizowane szablony dla typów danych dla których klasa i jej metody mają działać poprawnie. Ogólny szablon zrobiłbym tak żeby zwracał jakiś komunikat czy co tam by Cię interesowało w przypadku próby użycia szablonu z niechcianymi typami danych. Dobry opis specjalizacji znajdziesz tutaj.
Tak z ciekawości muszę się zapytać - po co Ci to?

0

oprócz specjalizacji (które są dobrą propozycją jak najbardziej) możesz jeszcze rzucić okiem na bibliotekę boost:
http://boost.org/doc/html/boost_staticassert.html

0

Wicko dzieki za podpowiedz :) a potrzebne jest mi to na zajęcia na uczelni... gdybym pisał program dla siebie starałbym sie jakoś to obejść.

Co do biblioteki boost to na pewno kiedys sie przyda, ale w projekcie nie moge uzywac zadnych dodatkowych bibliotek. Moja klasa musi być uniwersalna i elastyczna, tak żeby każdy mógł ją sobie wyciąć z mojego programu i wstawić do swojego ;-)

0

boost mozesz uznac za fragment aktualnego standardu C++..

0

Może chodzi Ci o typeid? Jest dostarczany w ramach standardowych bibliotek.
Np:
#include <typeinfo>
...
template <class T>
class X {
X() { cout << typeid(T).name() << endl; }
};
przy pozniejszym zdefiniowaniu: X<int> x, zwroci "int".

0

nie calkiem.. typeid jest w gruncie rzeczy dynamiczny, a autorowi chodzi chyba raczej o ograniczenie statyczne - tak, zeby X<float> sie w ogole nie skompilowalo. skojarz wiec to raczej z konceptami (Concepts w rozumieniu template metaprogramming)

ponizej baaardzo prymitywny przyklad, kompilowane pod g++:

template<typename T>
class X
{
    class TypeGuard{public:TypeGuard();};

public:
    X(){TypeGuard();}
};

template<> X<int>::TypeGuard::TypeGuard(){}
template<> X<double>::TypeGuard::TypeGuard(){}

template<typename T> X<T>::TypeGuard::TypeGuard(){0=0;/*probowano uzyc innej specjalizacji niz dozwolona*/}

int main()
{
    X<double> d;
    X<int> i;
    // X<float> f;  // z tym odkomentowanym sie nie skompiluje
}

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