Bedenken Sie:Wie kann ich einen Dekltyp-Ausdruck mit einer Funktion schreiben, die eine nicht-konstante Referenz erwartet?
int convert_it(std::string& x)
{
return 5;
}
void takes_int_ref(int& i)
{
}
ich eine Funktion schreiben wollen, die besteht nur, wenn convert_it
angewendet werden kann und das Ergebnis in takes_int_ref
geben. Das heißt, die Funktion Körper ist:
template <typename A>
void doit(A& a)
{
int i = convert_it(a);
takes_int_ref(i);
}
Allerdings, wenn ich tun:
template <typename A>
auto doit(A& a) -> decltype(takes_int_ref(convert_it(a)), void())
es nicht, weil invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
funktioniert.
Ich dachte an die folgende Lösung, die funktioniert:
template <typename T>
T& gimme_ref(T t) { throw std::runtime_error("No"); return t; }
template <typename A>
auto doit(A& a) -> decltype(takes_int_ref(gimme_ref(convert_it(a))), void())
Allerdings scheint es hackish und die decltype
entspricht nicht mehr, was die Funktion Körper. Im Wesentlichen scheint das Problem zu sein, dass decltype
nur einen Ausdruck benötigt, während hier zwei Anweisungen im Funktionskörper benötigt werden.
Was wäre der richtige Ansatz hier zu nehmen?
sind 'std :: result_of' und' std :: enable_if' hilfreich? –