mehrdeutige konstruktoren



  • hallo

    ich hab ein kleines problem bei meinem code. ich habe eine klasse geschrieben, die man - ähnlich wie die stl container - mit range+fill oder mit 2 iteratoren initialisieren kann:

    explicit myclass(SizeType Size, ConstReferenceType Default = ValueType())
    		{
    		}
    		template<class InputIteratorType>
            myclass(InputIteratorType First, InputIteratorType Last)
    		{
    		}
    

    mein problem zeigt sich wenn ich folgendes mache:

    myclass<int> foo(5, 4); //hier wird der iterator-konstruktor aufgerufen, wtf?
    

    ideen zur behebung des problems?

    mfg



  • Caste 5 mal nach SizeType, der Templatekonstruktorvist offenbar bess weil keine Konvertierung notwendig.
    Notfalls enable_if.

    Edit: template <typename Iter, typename = typename std::iterator_trairs<Iter>::value_type> reicht.



  • Nathan schrieb:

    Edit: template <typename Iter, typename = typename std::iterator_trairs<Iter>::value_type> reicht.

    geht nicht, funktionstemplates und standard-templateargumente und so 🙄



  • Ging das nicht in C++11?

    Trotzdem, man kann den Konstruktor immernoch in ein traditionelles

    template<class InputIterator>
            myclass(InputIterator First, InputIterator Last,
             typename std::iterator_traits<InputIterator>::value_type* = 0)
            {
            }
    

    ändern. Das sollte eigentlich funktionieren, wenn auch ungetestet.


  • Mod

    Standard-Techniken:
    - Selektion per enable_if
    1. mit Default-Templateargument, oder
    2. per Default-Konstruktorargument
    - tag dispatching


  • Mod

    funktionstemplates und standard-templateargumente und so

    Das ist völlig in Ordnung. (Edit) Also seit C++11, das habe ich aber vorausgesetzt.



  • ja habe keinen c++11 support, hätte ich vll dazu sagen sollen, sorry.

    daher bleibt mir nur das mit dem default-funktionsargument übrig. bringt hoffentlich keinen runtime-overhead mit sich...

    gruss


Anmelden zum Antworten