template concept QStringConvertible = std::convertible_to; // small adjustments to how QList does IfIsInputIterator template using IfIsInputIterator = typename std::enable_if< std::is_convertible< typename std::iterator_traits::iterator_category, std::input_iterator_tag >::value && !QStringConvertible // added this line to the original QList implementation - without this, QStringListTest("abc", "def") calls the InputIterator cTor , bool>::type; class QStringListTest : public QList { public: template QStringListTest(Args... args) : QList{std::forward(args)...} { // takes an arbitrary amount of QString convertibles qDebug() << "args constructor called"; for (const auto& entry : *this) { qDebug() << entry; } } // this comes directly from QList template using if_input_iterator = IfIsInputIterator; template = true> QStringListTest(InputIterator i1, InputIterator i2) : QList(i1, i2) { // does not get called anymore from QStringListTest("abc", "def") now where it has been before qDebug() << "input iterator constructor called"; } };