Frage


Frage -Update gemäß den aktualisierten Anforderungen
Ich habe die folgende Funktion implementiert, die entweder zuerst nicht Nullelement zurückgeben oder eine Ausnahme ausgelegt hat.
Könnten Sie auch einen klassischeren und kürzeren Namen wie "Max", "Min", "Paar" erfinden?

template <typename T>
T select_first_not_empty( const T& a, const T&b )
{
    static T null = T();

    if ( a == null && b == null )
        throw std::runtime_error( "null" );

    return
        a != null ? a : b;
}

int main()
{
    const int a1 = 2;
    const int b1 = 0;

    const int* a2 = 0;
    const int* b2 = new int(5);

    const std::string a3 = "";
    const std::string b3 = "";

    std::cout << select_first_not_empty( a1, b1 ) << std::endl;
    std::cout << select_first_not_empty( a2, b2 ) << std::endl;
    std::cout << select_first_not_empty( a3, b3 ) << std::endl;

    return 0;
}
War es hilfreich?

Lösung

Sie können als nächstes versuchen

template < typename T >
T get_valuable( const T& firstValue, 
                const T& alternateValue, 
                const T& zerroValue = T() )
{
    return firstValue != zerroValue ? firstValue : alternateValue;
}

// usage
char *str = "Something"; // sometimes can be NULL
std::string str2 ( get_valuable( str,  "" ) );

// your function
template <typename T>
T select_first_not_empty( const T& a, 
                          const T& b, 
                          const T& zerroValue = T() )
{
    const T result = get_valuable( a, b, zerroValue );
    if ( result == zerroValue )
    {
        throw std::runtime_error( "null" );
    }
    return result;
}

Andere Tipps

C# hat einen ähnlich funktionierenden integrierten Operator ??, was ich glaube, wird Koalesce genannt.

Perl's || (Kurzschluss-logischer oder) Operator hat auch eine ähnliche Funktionalität: Anstelle der Rückgabe von 0 oder 1 gibt er den Wert des ersten Arguments zurück, das zu true bewertet wird:

0 || 7

Gibt 7 zurück, nicht 1 oder true Als C C ++ oder C# würde der Programmierer erwarten.

Das Nahte, was C ++ integriert hat, ist der Find_if -Algorithmus:

vector<int> vec;
vec.push_back(0);
vec.push_back(0);
vec.push_back(7);

vector<int>::iterator first_non_0 = 
    find_if(vec.begin(), vec.end(), bind2nd(not_equal_to<int>(), 0));

Wenn der CTOR für T etwas Wichtiges macht, scheint es, als hätten Sie es jedes Mal durch "select_first_not_empty" dreimal tun.

Oracle nennt etwas Ähnliches "Koalesce", wenn Sie nach einem besseren Namen suchen.

Ich bin mir jedoch nicht sicher, worum es geht. Wenn ich wirklich wissen wollte, ob etwas festgelegt war oder nicht, würde ich eher nullbare Zeiger als Referenzen verwenden. "Null" ist ein weitaus besserer Indikator für die Absicht, den Variablen nicht zu haben, als einen In-Band-Wert wie 0 oder "" zu verwenden.

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