Ich habe eine Template-Funktion, die ich nur für Standard-Container (oder Container kompatibel mit Standard-Containern, die mindestens eine begin()
Member-Funktion bieten). Ich SFINAE-ing aus Nicht-Container auf folgende Weise:Wie SFINAE out non-Container-Parameter
template<typename Container>
typename Container::value_type
f(const Container& c,
typename std::enable_if<
std::is_same<
decltype(*c.begin()),
typename Container::value_type
>::value
>::type* = nullptr)
{
// implementation here
}
Die std::is_same
und decltype
nicht zu elegant aussehen. Gibt es dafür einen besseren Weg?
PS: Ich brauche die SFINAE hier, weil ich eine andere Überlastung
template<typename Derived>
f(const Eigen::MatrixBase<Derived>& A)
haben und wenn ich f(some_Eigen_matrix)
versuchen, die Container
Überlastung endet abgeholt, dann spuckt der Compiler einen Fehler, weil der Typ fehlt begin()
.
Warum machst du die Gleichheitsprüfung, überhaupt? Reicht es nicht aus, wenn der Ausdruck gültig ist? – Columbo
'auto f (const Behälter & c) -> decltype (c.begin(), (void) c.end())' –
Ok, es ist ein bisschen chaotischer. Der Rückgabetyp ist eine Summe über die Elemente des Containers. – vsoftco