Frage

Ich bin versucht zu schreiben, einen generischen Filterung Funktion, die führt eine lineare interpolation an einer bestimmten sampling-Koordinate in einem multi-dimensionalen Arrays (beliebigen Rang).Für diese, ich muss eine rekursive Funktion-Vorlage, die geht durch alle Dimensionen in einem array, bis es Sie trifft einen Wert und seine zugeordneten Typ.Ich verwende boost::enable_if, um zu erkennen, Wann zu stoppen, Durchlaufen die Abmessungen.Es funktioniert in Ordnung, bis ich versuche, Sie zu "versickern" die Rückkehr Wert/Typ der oberste Funktion.Zu diesem Zweck habe ich versucht, die Verwendung von C++0x-Typ-Inferenz, aber es scheint nicht, um gut zu mischen mit boost::enable_if.

Ich habe das problem isoliert nach unten auf das, was folgt:

template< typename T, std::size_t I >
auto test(const T &t) -> typename boost::enable_if_c< (I == 0), typename T::value_type >::type
{
    return t[0];
}

template< typename T, std::size_t I >
auto test(const T &t) -> typename boost::enable_if_c< (I > 0), decltype(test< T, I - 1 >(T())) >::type
{
    return test< typename T::value_type, std::size_t(I - 1) >(t[0]);
}

Der compiler (GCC 4.6) beklagt, mit dem folgenden code:

typedef std::array< std::array< float, 1 >, 1 > myarray;
myarray ma;
std::cout << typeid (test< myarray, 1 >(ma)).name() << std::endl;

Fehlermeldung:

error: conversion from 'boost::enable_if_c<true, float>::type' to non-scalar type 'boost::enable_if_c<true, std::array<float, 1u> >::type' requested

Es scheint, dass decltype verwendet den Rückgabewert von test< T, I >, obwohl er dazu aufgefordert wird, die Verwendung, dass der test< T, I - 1 >.Irgendeine Idee, warum dieses Verhalten Auftritt?Für jetzt, ich denke, ich werde einfach das ganze in einen Funktor...

War es hilfreich?

Lösung

Das Problem ist, dass Sie vergangen, T() (T) zu decltype.Die Typen sind nicht Umklappen.Dies ist klar, wenn Sie vergleichen die Rückkehr-Ausdruck, um was Sie übergeben decltype - Sie sind inkonsistent.

template< typename T, std::size_t I >
auto test(const T &t) -> typename boost::enable_if_c< (I > 0), decltype(test< T, I - 1 >(T())) >::type
{
    return test< typename T::value_type, std::size_t(I - 1) >(t[0]);
}

decltype: test<T

return expression: test< typename T::value_type

Bei der Definition von forward-Funktionen wie diese, die decltype-Ausdruck verwendet, um zu definieren, der Rückgabetyp sollte es immer sein, genau das gleiche wie die tatsächlichen Erträge Ausdruck.

Edit:Ich muss hinzufügen, dass darf nicht passieren rvalues, wenn du auch in der Realität passieren lvalues, insbesondere Vorlagen, wie Sie können mit unterschiedlichen Ergebnissen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top