Przeladowanie operatora ->, szablon, problem, zabezpieczenie

0

Witam
Ostanio na ćwiczeniach robiliśmy szablony. Jak wiadomo operator-> da sie jedynie przeładować tak żeby zwracał wskaźnik do klasy. Jak sie zabezpieczyć przed błędem jaki niesie ze sobą użycie szablonu z typem wbudowanym ? np int.

template <typename T>
class AaA
{
private :
    T *a;
public:
    T *operator->()
     {
            return a;
     }
}
 
1

Nijak — użycie int w przykładzie powyżej wcale nie jest błędem.
Szablony w C++ są „na gębę”, bez możliwości łatwej kontroli z czym ich się później używa. Najwyżej kod się przestanie kompilować*, albo działać.

‌*) wyrzucając kompletnie nieczytelną litanię błędów

1

A po co Ty masz się zabezpieczać? Zrobi to za Ciebie kompilator. Jeśli wykorzystasz w tym szablonie któryś z typów wbudowanych i będziesz chciał skorzystać z operatora -> to dostaniesz błąd na poziomie kompilacji. Przeciążając taki operator jasno dajesz do zrozumienia, iż chodzi ci o klasy definiowane przez użytkownika, więc użycie typów wbudowanych jest z założenia błędem, który trzeba rozwiązywać właśnie na poziomie kompilacji.
Natomiast jeśli chciałbyś korzystać z tego szablonu dla klas i typów wbudowanych (z np. tym zastrzeżeniem, że dla typów nie będzie operatora ->) to skorzystaj z częściowej specjalizacji szablonów klas. Przykład:

template <typename T, bool type = false>
class AaA
{
private :
    T *a;
public:
    T *operator->()
     {
            return a;
     }
};

template <typename T>
class AaA<T, true>
{
private :
    T *a;
public:

};

void func()
{
	AaA<std::string> obj1;
	AaA<int, true> obj2;

	obj1->empty();
}
 
1

Żeby w zrozumiały dla użytkownika tej klasy sposób zakomunikować mu, że robi źle możesz zrobić takie coś:

#include <type_traits>
// ...
// konstruktor:
AaA() {
  static_assert(!std::is_fundamental<T>::value, "Nie mozna uzyc tego typu!");
}
// ...
0

Pobrałem Pasje C++ i przeczytałem pierwsze 100 stron. Wszystko stało się jasne.
Jest jakieś info o nowym wydaniu Pasji ?
Dzięki za pomoc.

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