2017-01-20 6 views
0

Ich weiß, dass es Fragen mit dem gleichen Thema gibt, aber dieses fragt nach etwas Spezifischerem.Übergeben Sie einen Typennamen an einen Vorlagenoperator

Ich erstelle einen Mehrzweck-Templat-Container für den persönlichen Gebrauch. Die Details sind nicht wichtig, aber hier sind grundlegende Operatoren, die ich mit meinem Behälter verwenden wollte:

  • obj[n], die zurückgibt seine eigene Art, so dass es verwendet werden kann Werte zuzuordnen, wie in obj[n]=value; (als L-Wert)

  • überladenen obj[n] welchen Wert in dem "Array", wie in something=obj[n]; (als R-Wert)

der zweite überladene Operator ist derjenige I nach tal will gespeichert abgerufen kehrt k ungefähr.

ein äußerst minimal Beispiel verwenden, sind hier die grundlegenden Aussehen meiner Klasse:

template <typename T1, typename T2> 
class example 
{ 
    /*some private and public definitions*/ 

    example<T1, T2>& operator[] (int n) 
    { 
     current = n; 
     return *this; 
    } 

    template <typename U> 
    U operator[] (int n) 
    { 
     /*some operations*/ 

     return something; 
    } 
}; 

Das Problem ist, möchte ich den Rückgabewert des überladenen Operator parametrisieren.

Ich habe hier in stackoverflow eine Frage gelesen, dass dies nur durch expliziten Aufruf des Operators möglich ist.

Meine Frage ist, wie kann ich dieses Problem umgehen, so dass, wenn ich einen üblichen Operator Aufruf nicht parametrisieren kann, zumindest meinen rvalue Operator [] anders zu implementieren, was ich erreichen will, um möglich zu sein?

Antwort

1

Es gibt zwei Operatoren, die möglicherweise in Ihrem Code überlastet sind. Der Operator [] und der Operator =. Sie könnten [] überladen, um einen rvalue an eine spezielle Klasse zurückzugeben, und dann = für diese spezielle Klasse überladen, je nachdem, ob diese Klasse links oder rechts vom Operator erscheint.

Verwandte Themen