Operator overloading - throw

0

Coś mi umyka, ale...
Dlaczego standard nie przewiduje możliwości przeładowania operatora throw, podobnie jak robi to z new oraz delete?

Czy nie istnieje absolutnie żadne przydatne zastosowanie przeładowania throw?
Czy jest to sprzeczne z filozofią wyjątków?

Z góry dzięki za odpowiedzi na to głupie pytanie :)

0

Bo to po prostu nie ma sensu. To tak, jak byś chciał przeciążyć if - throw to nie jest operator.*

(No pewnie coś się da wymyślić, ale czy to będzie miało sens)

* - ok to nie jest takie oczywiste: http://4programmers.net/Forum/C_i_C++/202964-operator_overloading_-_throw?p=873075#comment-83779

0

C++ jest już tak pokręconym językiem, że nie wymyślajmy lepiej co miałoby znaczyć przeładowywanie throw lub co gorsza if-a…

…ale żeby było śmiesznie, w C# można przeciążyć operatory true i false, dzięki czemu można sterować zachowaniem m.in. ifa i while'a.

0

A czy istnieje jakiś powód, dla którego "to po prostu nie ma sensu"...?

Całe to pytanie wzięło się, mniej więcej, stąd:
http://www.parashift.com/c++-faq/throwing-polymorphically.html

1

#define throw i masz "przeciążenie" [rotfl]

1

Jeśli chcemy przeładować jakąś nazwę czy to funkcji czy operatora mamy na celu zdefiniowanie innego sposobu ich wykonania dla różnych obiektów. throw nie jest nawet operatorem bo nie zwraca żadnej wartości. Mamy takie coś

		throw obA;
		throw obB;
 

chcemy aby dla obiektu typu A i B wywołanie throw było inne. Zastanówmy się co moglibyśmy zrobić w "funkcji przeładowywującej". Na bank musielibyśmy użyć wewnątrz jej throw i "rzucić dalej obiekt" bo własnej implementacji nie będziemy pisać. Przedtem moglibyśmy zrobić rzeczy związane z konkretnym typem obiektu. Np zmiana jego wartości lub wypisanie jakiejśc informacji na ekranie. Ale przecież to samo mozna by było uzyskać pisząc to po prostu w kodzie.
Np:

#include <iostream>

class Obiekcik
{
public:
	int a;
};

class Obiekcik2
{
public:
	int b;
};

int main()
{
        
	Obiekcik ob;
	ob.a = 5;

	Obiekcik2 ob2;
	ob2.b = 10;

	try
	{
                std::cout <<"Rzucam ob";
                ob.a = 2345;
		throw ob;

                std::cout <<"Rzucam ob2";
                ob2.b = 543;
		throw ob2;
	}

	catch(Obiekcik & ob)
	{
		std::cout << ob.a << "\n";
	}

	catch(Obiekcik2 & ob)
	{
		std::cout << ob.b << "\n";
	}

	std::cin.get();
}
 

Dlatego właśnie przeładowywanie throw jest bezsensu

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