Betrachten Sie das folgende:Vorlage Weiterleiten von Anrufen zu einer Methode Mitglied
template <typename type> class my_wrapper
{
type _;
template <typename... types, typename std :: enable_if <has_my_method_callable_with_the_following_types <type, types...> :: value> :: type * = nullptr> void my_method(types... items)
{
_.my_method(items...);
}
};
Wo, wie Sie sich vorstellen können, has_my_method_callable_with_the_following_types
eine Art SFINAE Struktur ist, die mir erlaubt, zu bestimmen, ob type
eine Methode, die mit aufgerufen werden kann diese Arten.
Wie Sie sehen können, leitet das obige Beispiel grundsätzlich alle Anrufe an my_method
bis _
weiter. Gut. Fast alle von ihnen. Was passiert, wenn ich tun:
class my_type
{
void my_method(int & x)
{
x++;
}
};
my_wrapper <my_type> my_wrapped;
int x;
my_wrapped.my_method(x);
klar, dass die oben nicht funktionieren, wie x
auf die Funktion von Kopie übergeben werden würde, während my_type :: my_method
es durch Verweis akzeptiert. Also frage ich mich: Gibt es eine Möglichkeit, dieses Problem zu umgehen? Ich könnte natürlich tun:
template <typename... types, typename std :: enable_if <has_my_method_callable_with_the_following_types <type, types & ...> :: value> :: type * = nullptr> void my_method(types & ... items)
{
_.my_method(items...);
}
Aber dann symmetrisch ich habe Probleme, wenn ich vorbei bin, sagen wir, int
Literale, die ich durch Verweis nicht nehmen können, aber das wäre von einigen my_type :: my_method(int x)
durchaus akzeptabel sein.
Wie kann ich dieses Problem umgehen? Ich möchte alle Anrufe nahtlos an my_wrapper <type> :: my_method
zu type :: my_method
weiterleiten.
Piraten Vorsicht: Ich kann Vererbung nicht verwenden, also bitte nicht vorschlagen, dass! :)
Sie suchen nach dem sogenannten "perfekten Weiterleiten" – lorro