Angenommen, ich habe eine Funktion unique_count
, die die Anzahl der eindeutigen Elemente in jedem unsortiert Bereich zählen:zuweisbare Bezug auf beide lvalues und rvalues
template<typename InputIt>
std::size_t unique_count(InputIt first, InputIt last)
{
using T = typename std::iterator_traits<InputIt>::value_type;
std::vector</* ??? */> v(first, last);
std::sort(v.begin(), v.end());
return std::distance(v.begin(),
std::unique(v.begin(), v.end()));
}
ich eine neue vector
, weil ich will nicht Ändern Sie den ursprünglichen Container, aber ich möchte auch nicht unnötig kopieren. Die einfachste Lösung besteht darin, einen Vektor von Zeigern zu erstellen, aber ein Problem ist *first
, das entweder const T&
(z. B. von vector
) oder T
(z. B. von einem Strom) zurückgeben kann.
Der /* ??? */
Teil sollte daher konzeptionell const T&
entsprechen. Das können wir nicht wirklich machen, da vector
s keine Referenzen enthalten können, die nicht zuordenbar sind. Wir können reference_wrapper<const T>
auch nicht verwenden, da es nicht aus Provisorien konstruiert werden kann.
Welche Alternativen habe ich?
Jetzt bin ich mit 'std :: conditional' den Vektorwert Typ zwischen' T' auszuwählen und 'reference_wrapper' abhängig von 'is_lvalue_reference :: value'. Halten Sie das für einen vernünftigen Ansatz? –
@ZizhengTai Klingt gut für mich. – Brian