Reference zu pointer template



  • Hallo zusammen,
    Folgendes Problem, ich will den Zugriff eine Variable normieren, egal ob es sich um einen Pointer handelt oder nicht.
    Zu Verdeutlichung der folgende Quelltext.
    Ich habe auch schon mit den type_traits der Boost rum gespielt komme aber zu keinem Ergebnis.
    Irgendwelche Vorschläge, sollte auf jedenfall C++98 sein.
    Danke schon mal

    #include <iostream>
    #include <boost/type_traits/is_pointer.hpp>
    #include <boost/type_traits/remove_pointer.hpp>
    
    using namespace std;
    
    /*
    template <typename T>
    inline typename boost::remove_pointer<T>::type getPointer(const T &value)
    {		
    	return boost::is_pointer<T>::value ? *value : value ;
    }
    */
    
    template <typename T>
    inline const T * getPointer(const T &value)
    {	
    	return &value ;
    }
    
    template <typename T>
    inline const T *getPointer(const T * value)
    {
    	return value ;
    }
    
    struct DataValue
    {
    	int m_FirstValue ;
    	int m_SecondValue ;
    	DataValue(int first,int second)
    	:m_FirstValue(first),m_SecondValue(second)
    	{}
    };
    
    int main()
    {
    	DataValue StackValue(10,100) ;
    	cout << getPointer(StackValue)->m_FirstValue << "\n";
    
    	DataValue *HeapValue=new DataValue(30,300) ;
    	cout << getPointer(HeapValue)->m_FirstValue << "\n";
    	delete HeapValue ;
    }
    


  • Du musst halt noch die non-const Überladungen hinzufügen, dann sollte es gehen.

    template <typename T>
    inline const T * getPointer(const T &value)
    {
      return &value ;
    }
    template <typename T>
    inline T * getPointer(T &value)
    {
      return &value ;
    }
    
    template <typename T>
    inline T *getPointer(T * value)
    {
      return value ;
    }
    template <typename T>
    inline const T *getPointer(const T * value)
    {
      return value ;
    }
    

    Ansonsten wird z.B "int*" auf "int *const&" gemapped, was du nicht willst.



  • Danke für deine Antwort.
    Mit dem gcc wird alles ohne Probleme compiliert und läuft auch entsprechend.
    Mit meinen Borland 5 krieg ich folgenden Fehler:

    d:\myprog\getPointer>bcc32 -Ic:\etsbuilder\include getPointer.cpp
    Borland C++ 5.5.1 für Win32 Copyright (c) 1993, 2000 Borland
    getPointer.cpp:
    Fehler E2015 getPointer.cpp 67: Mehrdeutigkeit zwischen 'getPointer<DataValue *>(DataValue * &)' und 'getPointer<DataValue>(DataValue *)' in Funktion main()
    *** 1 Fehler bei der Compilierung ***

    Noch eine Idee wie ich den Dreckskompiler aus tricksen könnte ?



  • Ich vermute mal SFINAE hast Du schon probiert und das kann der Compiler auch nicht?

    template <typename T>
    inline const T* getPointer(const T& value, typename enable_if<!boost::is_pointer<T>::value, int>::type = 0)
    {  
        return &value ;
    }
    
    template <typename T>
    inline T getPointer(T value, typename enable_if<boost::is_pointer<T>::value, int>::type = 0)
    {
        return value;
    }
    

  • Mod

    Das soll vermutlich

    template <typename T>
    inline const T * getPointer(const T &value)
    {  
        return &value ;
    }
    
    template <typename T>
    inline const T *getPointer( T * const &value)
    {
        return value ;
    }
    

    sein.


Anmelden zum Antworten