Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

riCo

Treue Seele

  • »riCo« ist der Autor dieses Themas

Beiträge: 165

Beruf: Student

  • Private Nachricht senden

1

26.07.2007, 08:34

Template Typeneinschränkung

Hallo,
ich bastle mit grade eine Templatefunktion mit zwei Typen. Einen der beiden Typ möchte ich allerdings auf double oder float beschrenken. Ist dies möglich und wenn ja, wie?

Danke im Voraus,
Rico
Wir leben alle unter dem Sternenhimmel, aber wir haben nicht alle den gleichen Horizont.

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

2

26.07.2007, 09:38

So z.B:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <typename T>
class Test
{
public:
  void foo()
  {
  }
};

///Alle typen die nicht verwendet werden dürfen

///spezialisieren und den Konstruktor private 

///machen


template <>
class Test<int>
{
private:
  Test();
};


Du kannst es natürlich auch umgekehrt machen. Die korrekten Implementierungen spezialisieren und public Konstruktor, und den
Konstruktor der nicht spezialisierten Klasse private machen.

Für Template Funktionen fällt mir jetzt auf die Schnelle nichts derartiges ein. Nur etwas in der Art:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
template <typename T> void foo(T)
{
}

template <> void foo(int)
{
  assert(false);
}


Hier bekommst du halt leider keinen compiler-Error mehr, sondern nur mehr eine Laufzeitüberprüfung. Also entweder Laufzeitüberprüfung, oder den Umweg über Klassen nehemen.

mfg Philipp

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

26.07.2007, 09:50

Mit Klassen geht es auch noch ein bisschen einfacher:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<typename T> class MustBeFloatOrDouble;
template<> class MustBeFloatOrDouble<float> {};
template<> class MustBeFloatOrDouble<double> {};

template<typename T> class Test : MustBeFloatOrDouble<T>
{
public:
    Test()
    {
    }

    ~Test()
    {
    }

    // ...

};

Test<float> t1; // geht

Test<double> t2; // geht

Test<int> t3; // geht nicht


Mit Funktionen kannst du es dann so machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename T> class MustBeFloatOrDouble;
template<> class MustBeFloatOrDouble<float> {};
template<> class MustBeFloatOrDouble<double> {};

template<typename T1, typename T2> void function(const T1& x, const T2& y)
{
    static MustBeFloatOrDouble<T1> _helper;
    // ...

}

function(1.0f, 2); // geht

function(1.0, 2); // geht

function(1, 2); // geht nicht

riCo

Treue Seele

  • »riCo« ist der Autor dieses Themas

Beiträge: 165

Beruf: Student

  • Private Nachricht senden

4

26.07.2007, 10:07

danke, es funktioniert !
Wir leben alle unter dem Sternenhimmel, aber wir haben nicht alle den gleichen Horizont.

Werbeanzeige