Ich habe in der Suche nach einem static_if für mein C++ Projekt zu schreiben, und ich auf das folgende Stück Code gestolpert:std vorwärts und Betreiber ::()
#include <iostream>
using namespace std;
namespace static_if_detail {
struct identity {
template<typename T>
T operator()(T&& x) const {
return std::forward<T>(x);
}
};
template<bool Cond>
struct statement {
template<typename F>
void then(const F& f){
f(identity());
}
template<typename F>
void else_(const F&){}
};
template<>
struct statement<false> {
template<typename F>
void then(const F&){}
template<typename F>
void else_(const F& f){
f(identity());
}
};
} //end of namespace static_if_detail
template<bool Cond, typename F>
static_if_detail::statement<Cond> static_if(F const& f){
static_if_detail::statement<Cond> if_;
if_.then(f);
return if_;
}
template<typename T>
void decrement_kindof(T& value){
static_if<std::is_same<std::string, T>::value>([&](auto f){
f(value).pop_back();
}).else_([&](auto f){
--f(value);
});
}
int main() {
// your code goes here
std::string myString{"Hello world"};
decrement_kindof(myString);
std::cout << myString << std::endl;
return 0;
}
Alles macht Sinn für mich, außer zum einen: der überladene Operator() in struct identity
. Es nimmt eine rhs vom Typ T auf, genannt x, cool und all. Aber wenn identity
aufgerufen wird, wird nichts tatsächlich in Identität übergeben.
template<typename F>
void then(const F& f){
f(identity());
}
Oben, f ruft die Identität auf, übergibt jedoch nichts an die Identität. Die Identität gibt jedoch die weitergeleiteten Argumente (in meinem Fall eine std :: string) zurück und gibt das hinterste Zeichen der Zeichenkette aus. Wie gibt die Identität ein weitergeleitetes Argument zurück, wenn selbst keine Argumente zum Weiterleiten übergeben wurden?
Für mich sieht es so aus, als wäre 'f' eine Funktion und wird mit einem einzigen Argument vom Typ' identity' aufgerufen. Mit anderen Worten, "identity()" konstruiert eine Instanz des Typs "identity", der an die Funktion "f" übergeben wird. –
[This] (http://ideone.com/p8SlI9) ist, wie es aussehen würde, um ein ähnliches Objekt zu konstruieren und aufzurufen. –