- 1. Using
Exceptions are thrown during the execution of the program; if the error can be found at compile time, you can use static_assert , which tells you to correct the program code in key locations.
The use of static_assert will look like this.
static_assert(4<=sizeof(int), "integers are too small"); // checking the size of an integer
The syntax is as follows: static_assert(A, B); Where
- A - this is the condition under which the error will be thrown in the event that A is false
- B - this is the text of the error message
Using
static_assert can be useful when using constants and constant expressions that are evaluated at compile time.
This code checks the local constant rate, which can not be faster than the speed of light.
constexpr double C = 299792.458; // km/s, speed of light void f(double speed) { const double local_max = 160.0/(60∗60); // 160 km/h == 160.0/(60*60) km/s static_assert(speed<C,"can't go that fast"); // error: speed must be a constant static_assert(local_max<C,"Can not move faster"); // OK }
You can also use this check at key locations for transfers. For example, such an enumeration is given.
enum Types { E_BEGIN_TYPES, E_A = E_BEGIN_TYPES, E_B, E_C, E_D, E_END_TYPES = E_D };
And there is the following method or function in some place code
QString getStandardMessage(Types type) { static_assert(E_END_TYPES == 3, "Need to implement method for new type"); switch (type) { case E_A: return "Type A"; case E_B: return "Type B"; case E_C: return "Type C"; case E_D: return "Type D"; default: return "Type is not implemented"; } }
In this case, we know that the most recent enumeration, that is, E_D or E_END_TYPES is equal to 3. And an exception at compile time will not be thrown. But as soon as a new member of this enumeration is added.
enum Types { E_BEGIN_TYPES, E_A = E_BEGIN_TYPES, E_B, E_C, E_D, E_E, // Новый участник перечисления E_END_TYPES = E_E };
That static_assert will throw an error, which will mean that we forgot to correct this method. Correction will look like this.
QString getStandardMessage(Types type) { static_assert(E_END_TYPES == 4, "Need to implement method for new type"); switch (type) { case E_A: return "Type A"; case E_B: return "Type B"; case E_C: return "Type C"; case E_D: return "Type D"; case E_E: return "Type E"; default: return "Type is not implemented"; } }
In this method, we add the implementation of the code for type E_E , and also correct the static_assert itself, so that it takes into account the number of enumeration participants with the new participant.