In meinem Code muss ich testen, ob ein Typ, der einer Vorlage zugewiesen wird, ein Zeiger ist - sei er klug oder nicht. Laut Boost gibt es dafür keine zuverlässige und generische Methode (siehe hier ) - oder ist es?
Bisher überprüfe ich Folgendes:
T
in void*
? T
eine get()
Methode? T
einen Typ namens element_type
? get()
eine element_type*
zurück? Wenn (A || B & amp; & amp; C & amp; & amp; D), dann schließe ich, dass mein Typ eine Art Zeiger sein muss.
Hier ist die Vorlage:
%Vor% Bisher scheint es in Ordnung zu sein. Aber stimmt etwas nicht mit dieser Argumentation? Sollte ich auf böse Überraschungen vorbereitet sein? Was ist mit const
/ volatile
?
In den Kommentaren fragen Sie nach meiner Motivation und sie haben Recht, ich schulde Ihnen einen. Der Anwendungsfall ist eine Lua - C ++ - Bindungsbibliothek: Wenn ich eine Klasseninstanz mit template <typename T> push_value(T value)
an Lua exponiere, muss ich den zugrunde liegenden Typ U
in einer beliebigen Kombination von T = U const/volatile/*/&
und T = some_pointer<U>
ableiten. Ich muss wissen, ob die zugrunde liegende Klasse U
bereits mit dem Binder registriert wurde.
Es ist einfach zu überprüfen, ob es sich bei einem Typ um einen Zeiger handelt, indem Sie entweder boost verwenden oder eine benutzerdefinierte Vorlage mit einer Spezialisierung wie
definieren %Vor%Aber Sie können bei der void * -Lösung bleiben, wenn Sie mehr wollen.
Um intelligente Zeiger zu überprüfen, empfehle ich stattdessen, nach geeigneten Operatoren zu suchen. Ich denke, ein Typ kann nur dann als ein intelligenter Zeiger angesehen werden, wenn er sowohl operator * als auch operator- & gt; definiert. Sie sollten also nach
suchen %Vor%und verlangen, dass beide Ergebnisse "ja" sind. So kann die endgültige Formel als "normaler Zeiger || (hat Operator * & amp; & amp; hat Operator- & gt;") berechnet werden. "
Es ist jedoch nur eine Lösung für intelligente Zeiger. Wenn Sie auch andere Typen als Smartpointer (andere Wrapper, Sammlungen usw.) an Lua übergeben möchten, ist das eine ganz andere Geschichte, und ich wage nicht, eine Lösung dafür vorzuschlagen.
Tags und Links c++ templates shared-ptr