Wie kann dieser Code ohne Boost neu geschrieben werden?

8

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

zu instanziieren %Vor%

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.

    
athos 13.12.2017, 01:58
quelle

2 Antworten

17

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.

Was wurde refactored

  1. BOOST_STATIC_ASSERT bis STATIC_ASSERT (dies wird mit c ++ 17 veraltet: Ссылка )
  2. BOOST_STATIC_CONSTANT bis static constexpr
  3. BOOST_PREVENT_MACRO_SUBSTITUTION - & gt; PREVENT_MACRO_SUBSTITUTION (triviales Makro)
  4. BOOST_THROW_EXCEPTION wurde gelöscht. HINWEIS Dies bedeutet, dass der Code nicht kompiliert werden kann, wenn die Ausnahmeunterstützung deaktiviert ist.
  5. Alle Dinge im Zusammenhang mit Boost-Test

    • BOOST_CHECK - & gt; CHECK

      %Vor%
    • BOOST_CHECK_EQUAL - & gt; CHECK_EQUAL

      %Vor%
    • BOOST_AUTO_TEST_CASE - gelöscht. Der Testtreiber ist main now:

      %Vor%
  6. boost::ref - & gt; std::ref (von <functional> )

  7. Boost-Range-Helfer werden durch Standard-C ++ ersetzt ( boost::size , boost::end für Arrays)

  8. using ulong_long_type = unsigned long long;

  9. 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:

    %Vor%

    wurde:

    %Vor%
  10. Ebenso der Modulo-Schalter ( Power2Modulo und GenericModulo ), der so aussah:

    %Vor%

    wurde mit etwas c ++ 11 ( constexpr !) Güte viel einfacher:

    %Vor%
  11. <boost/cstdint.hpp> - & gt; <cstdint> (ersetzt ::boost durch ::std für uint_least32_t und uint32_t )

  12. Well_quoted type-Funktion wird durch eine Alias-Vorlage ersetzt ( template<...> using T = ... siehe Ссылка zu 2)

  13. typedef s wurde als Typaliase umgeschrieben.

Vollständige Auflistung

Live auf Coliru %Vor%     

sehe 13.12.2017, 14:06
quelle
8

Mit C ++ 17 wird dieser Code viel einfacher und die Fehlermeldungen sind freundlicher.

Dies ist eine Beispielimplementierung von Power2Modulo :

%Vor%

Sie können es wie folgt verwenden:

%Vor%

Getestet mit clang-6 und gcc-8 und VisualC ++ (über Ссылка ).

    
Rumburak 15.12.2017 19:39
quelle

Tags und Links