Mam szablon funkcji, który pobiera std::pair
, a także wartość jednego z typów pary. Chciałbym wywołać tę funkcję za pomocą wpisu z std::map
jako argumentu pair.Jak rozwiązać konflikt const/non-const w dedukcji argumentu szablonu
#include <map>
#include <utility>
template <typename T1, typename T2>
void do_stuff(std::pair<T1, T2> const &pair, T1 const &val) {
// Imagine that this does something important...
}
int main() {
std::map<int, float> foo { { 0, 0.0 } };
do_stuff(*foo.begin(), 0);
}
To nie skompilować, ponieważ typ wejścia mapie jest std::pair<const int, float>
, więc odliczenie typ dla T1
ma sprzecznych rodzajów: const int
poprzez pair
argument i int
poprzez val
argument.
test.cc: In function ‘int main()’:
test.cc:12:27: error: no matching function for call to ‘do_stuff(std::pair<const int, float>&, int)’
do_stuff(*foo.begin(), 0);
^
test.cc:5:6: note: candidate: template<class T1, class T2> void do_stuff(const std::pair<_T1, _T2>&, const T1&)
void do_stuff(std::pair<T1, T2> const &pair, T1 const &val) {
^~~~~~~~
test.cc:5:6: note: template argument deduction/substitution failed:
test.cc:12:27: note: deduced conflicting types for parameter ‘const T1’ (‘const int’ and ‘int’)
do_stuff(*foo.begin(), 0);
^
Jaki jest najlepszy sposób rozwiązania tego konfliktu? Najlepiej byłoby, gdyby T1
został wydedukowany jako int
, ale może być const int
, jeśli jest to łatwiejsze do wdrożenia.
Odkryłem, że mogę rozwiązać problem za pomocą albo std::remove_const
lub std::decay
od typu parametru val
:
void do_stuff(std::pair<T1, T2> const &pair, typename std::remove_const<T1>::type const &val) {
ale nie wiem który z nich jest bardziej odpowiednie, lub jeżeli istnieje inne rozwiązanie, które byłoby lepsze.
nie rozumiem ... dlaczego nie zdefiniujesz odpowiednio 'do_stuff()'; Mam na myśli 'szablon void do_stuff (std :: para const & pair, T1 const i val)'? –
max66
@ max66, Chcę, aby działała również z parami, których pierwszy typ * nie jest * const. (Ponieważ cały parametr jest przekazywany przez odniesienie do const, stałość elementów pary jest nieistotna: albo const lub non const powinno być dozwolone dla któregokolwiek z nich.) – Wyzard
Czy próbowałeś zbudować konstrukcję na mapie? Mam na myśli 'std :: map foo {{0, 0.0}};' –
mtb