Template programming idioms Trai5s

0

W ksiazce thiniing in c++ mamy przyklad traitsow który wklejam.

template<class T> class numeric_limits {
public:
  static const bool is_specialized = false;
  static T min() throw();
  static T max() throw();
  static const int digits = 0;
  static const int digits10 = 0;
  static const bool is_signed = false;
  static const bool is_integer = false;
  static const bool is_exact = false;
  static const int radix = 0;
  static T epsilon() throw();
  static T round_error() throw();
  static const int min_exponent = 0;
  static const int min_exponent10 = 0;
  static const int max_exponent = 0;
  static const int max_exponent10 = 0;
  static const bool has_infinity = false;
  static const bool has_quiet_NaN = false;
  static const bool has_signaling_NaN = false;
  static const float_denorm_style has_denorm =
                                  denorm_absent;
  static const bool has_denorm_loss = false;
  static T infinity() throw();
  static T quiet_NaN() throw();
  static T signaling_NaN() throw();
  static T denorm_min() throw();
  static const bool is_iec559 = false;
  static const bool is_bounded = false;
  static const bool is_modulo = false;
  static const bool traps = false;
  static const bool tinyness_before = false;
  static const float_round_style round_style =
                                 round_toward_zero;
};

Następnie jest taki akapit.

The values that will always be integral are static data members of numeric_limits. Those that may not be integral, such as the minimum value for float, are implemented as static inline member functions. This is because C++ allows only integral static data member constants to be initialized inside a class definition.

Co to konkretnie oznacza ? To że member jest nie całkowity np. float to jaki ma to związek z funkcjami inline ? Jak rozumiecie ten akapit ?

6

Dawno, dawno temu, w czasach C++ łupanego, nie można było robić statycznych liczb zmiennoprzecinkowych jako elementów składowych klasy. Dlaczego? Żeby „nie komplikować robienia linkerów” (źródło). I tak jak w tamtym kodzie Stroustrupa, poniższy kod nie był poprawny:

class Y {
	const int c3 = 7;		// error: not static
	static int c4 = 7;		// error: not const
	static const float c5 = 7;	// error: not integral
};

Zatem, żeby to obejść, komisja zdecydowała się, że jeśli potrzebne są jakieś stałe nie-całkowitoliczbowe (Twoja książka podaje jako przykład „minimalną wartość floata”), to implementowali ją jako rezultat odpowiedniej statycznej inline’owanej funkcji — zobacz tutaj. Była też dostępna jako zwykłe makro w stylu C, tutaj — FLT_MIN.

Na szczęście nie żyjemy już w takich wiekach mhrocznych, i constexpr można używać całkiem normalnie:

class Y {
	static constexpr float c5 = 7;	// wszystko gra
};

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