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.
-
Standard-Techniken:
- Selektion per enable_if
1. mit Default-Templateargument, oder
2. per Default-Konstruktorargument
- tag dispatching
-
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