浏览代码

Submitted proposal for template class refactoring

Clemens-A. Brust 11 年之前
父节点
当前提交
44b8a3e716
共有 4 个文件被更改,包括 54 次插入2 次删除
  1. 12 2
      NOTES
  2. 15 0
      core/ignore/OpaqueT.cpp
  3. 15 0
      core/ignore/OpaqueT.h
  4. 12 0
      core/ignore/OpaqueT.tcc

+ 12 - 2
NOTES

@@ -1,12 +1,22 @@
 ## Wichtigere Sachen
-*Für die generischen Klassen müssen wir uns etwas überlegen*. Die Implementationen müssen mit in die Header, aber wir können die Lib so "von außen" nicht benutzen, weil wir beim Kompilieren der Templates die NICE_USELIB.. aus unserem Buildsystem brauchen und damit auch noch beim Benutzer Abhängigkeiten erzeugen, die vermeidbar wären.
+*Für die generischen Klassen müssen wir uns etwas überlegen*. Die Implementationen müssen mit in die Header, aber wir können die Lib so "von außen" nicht benutzen, weil wir beim Kompilieren der Templates definitiv unser Buildsystem brauchen (die ganzen Makros, Libs...). Das macht eine Distribution von Binaries quasi unmöglich.
 
 ```
 $ grep --include={*.h,*.tcc} -rnw ./ -e ".*def.*USELIB.*" | wc -l
 185
 
 ```
-In den meisten Fällen können wir wohl die Template-Funktion explizit instantiieren und in den Header nur noch "extern template..." angeben.
+
+Daher mein Vorschlag:
+
+1. Wir schränken für jede betroffene Klasse die möglichen Instanzen ein und kompilieren alle davon explizit mit. Ein Beispiel habe ich in den Ordner "ignore" gepackt.
+Vorteile:
+	* Benutzer braucht nur noch die Header einzubinden und mit nice_core zu linken -> er muss nice_core nicht kompilieren, sondern kann einfach Binaries und Header installieren.
+	* Je nach Lizenzen können wir einige Libraries statisch reinlinken, dabei fallen die nicht benutzten Funktionen raus und die Benutzer muss nicht einmal die sos der Abhängigkeiten installieren.
+	* Wenn wir in der Implementierung eine weitere Abhängigkeit einbauen, machen wir dem Benutzer seinen Buildprozess nicht kaputt.
+Nachteile:
+	* Für Containertypen eher unbrauchbar.
+	* Speicher?
 
 ## Buildsystem
 -- WITH_QT OFF verhindert nicht das Kompilieren von libimagedisplay, die hängt aber von Qt ab.

+ 15 - 0
core/ignore/OpaqueT.cpp

@@ -0,0 +1,15 @@
+/*
+   Example files for explicit opaque templates
+*/
+
+#include <iostream>
+#include <string>
+
+#include "OpaqueT.h"
+#include "OpaqueT.tcc"
+
+namespace NICE {
+		// Explicit instances
+		template class OpaqueT<std::string>;
+		template class OpaqueT<int>;
+}

+ 15 - 0
core/ignore/OpaqueT.h

@@ -0,0 +1,15 @@
+/*
+   Example files for explicit opaque templates
+*/
+
+#ifndef IGNORE_OPAQUET_H_
+#define IGNORE_OPAQUET_H_
+
+namespace NICE {
+	template <class T> class OpaqueT {
+		public:
+			void CallMe(T arg);
+	};
+}
+
+#endif

+ 12 - 0
core/ignore/OpaqueT.tcc

@@ -0,0 +1,12 @@
+/*
+   Example files for explicit opaque templates
+*/
+
+#include "OpaqueT.h"
+
+namespace NICE {
+	// Implementations
+	template<class T>void OpaqueT<T>::CallMe(T arg) {
+		std::cout << arg;
+	}
+}