Meine Aufgabe ist es, Sergiu Dotencos Well Equidistributed zu modifizieren Long-period Linear (WELL) -Algorithmus Code, um Boost nicht zu verwenden (nicht zu sagen, dass Boost schlecht ist, aber aufgrund der Unternehmenspolitik muss ich es entfernen).
Nun, Sergius WELL benutzt die mpl-Bibliothek von boost, da steckt eine ganze Menge dahinter. Ein Weg ist, all diese Dinge zu lesen, dann wäre ich natürlich in der Lage, die Aufgabe zu beenden. Der andere Weg ist, nach und nach mit einer guten Schätzung zu ersetzen.
Ich bin auf dem zweiten Weg, um zu hoffen, dass dieser Versuch-und-Fehler-Ansatz schneller wäre. Bis jetzt habe ich erfolgreich boost::mpl::if_
und if_c
durch std::conditional
ersetzt, aber habe einen Fehler beim Versuch, IsPowerOfTwo
und Power2Modulo
etc zu aktualisieren, deshalb suche ich dort Hilfe.
Unten ist der Code, wie man es ohne Boost umschreiben kann, aber nur c ++ 17?
%Vor% Wenn möglich, geben Sie bitte ein kurzes Beispiel dafür, wie es aufgerufen wird? Ich habe versucht, IsPowerOfTwo
oder Power2Modulo
in main mit
oder
%Vor%, aber Kompilierungsfehler.
Ich habe eine relevante Frage vor und gestellt habe einen Vorschlag bekommen . Allerdings nicht vertraut mit Metaprogrammierung und Boost, ich verstehe es nicht ganz.
Also habe ich mir diese Bibliothek angesehen und eine No-Boost-Verzweigung erstellt, die den WELL-Pseudozufallszahlengenerator an reines c ++ 11 anpasst.
Siehe hier auf meinem GitHub: Ссылка (der Standardzweig ist no-boost
).
Was ist zufällig?
gut-zufällig ist eine C ++ 11 Gabel von random , eine Sammlung von verschiedenen Pseudo-Zufallszahlengeneratoren und Verteilungen, die vorgesehen waren um die Boost-Zufallszahlenbibliothek zu begleiten.
Diese Gabel verwendet derzeit nur den WELL-Generator und seine Tests.
Erste Schritte
Der Zweig ohne Boost benötigt keine Boost-Bibliothek mehr. Stattdessen es erfordert c ++ 11. Um die Tests zu kompilieren, stellen Sie sicher, dass CMake 2.8 ist installiert, dann geben Sie ein:
%Vor%in Ihrem Terminal oder in der Eingabeaufforderung in Windows innerhalb von Projekten Verzeichnis, um die geeignete Konfiguration zu generieren, die verwendet werden kann um die Tests mit make / nmake oder innerhalb einer IDE zu kompilieren.
BOOST_STATIC_ASSERT
bis STATIC_ASSERT
(dies wird mit c ++ 17 veraltet: Ссылка ) BOOST_STATIC_CONSTANT
bis static constexpr
BOOST_PREVENT_MACRO_SUBSTITUTION
- & gt; PREVENT_MACRO_SUBSTITUTION
(triviales Makro) BOOST_THROW_EXCEPTION
wurde gelöscht. HINWEIS Dies bedeutet, dass der Code nicht kompiliert werden kann, wenn die Ausnahmeunterstützung deaktiviert ist. Alle Dinge im Zusammenhang mit Boost-Test
BOOST_CHECK
- & gt; CHECK
BOOST_CHECK_EQUAL
- & gt; CHECK_EQUAL
BOOST_AUTO_TEST_CASE
- gelöscht. Der Testtreiber ist main
now:
boost::ref
- & gt; std::ref
(von <functional>
)
Boost-Range-Helfer werden durch Standard-C ++ ersetzt ( boost::size
, boost::end
für Arrays)
using ulong_long_type = unsigned long long;
Die Bedingten Operatoren shift
und mod
wurden mit Straight-Up SFINAE basierend auf std::enable_if
neu implementiert, anstatt die MPL-Meta-Programmierung zu verwenden:
wurde:
%Vor% Ebenso der Modulo-Schalter ( Power2Modulo
und GenericModulo
), der so aussah:
wurde mit etwas c ++ 11 ( constexpr
!) Güte viel einfacher:
<boost/cstdint.hpp>
- & gt; <cstdint>
(ersetzt ::boost
durch ::std
für uint_least32_t
und uint32_t
)
Well_quoted
type-Funktion wird durch eine Alias-Vorlage ersetzt ( template<...> using T = ...
siehe Ссылка zu 2)
typedef
s wurde als Typaliase umgeschrieben.
Live auf Coliru %Vor%
Tags und Links c++ random boost metaprogramming