Mam funkcji z tymi przeciążeniami:Zwracanie wartości z tego samego constness jako parametr
A& f(B& b)
{
return b.a;
}
const A& f(const B& b)
{
return b.a;
}
Instrukcja return może być znacznie bardziej skomplikowana logika, która zwraca pewną wartość, która jest const jeśli b
jest const. Na przykład: B
to kontener kontenerów (prawdopodobnie z jeszcze głębszym zagnieżdżeniem) i szukamy jednego elementu. W takim przypadku skopiowanie funkcji nie jest dobrym pomysłem. Czy są jakieś alternatywy dla osiągnięcia tego samego rezultatu?
Potrafię wymyślić jakieś rozwiązania, ale tak naprawdę ich nie lubię.
template <typename T>
auto f(T& b) -> decltype(b.a)
{
return b.a;
}
Działa jednak komplikuje się jeśli b.a
nie jest tak trywialne (jak w zw pojemników).
A& f(B& b)
{
return b.a;
}
const A& f(const B& b)
{
return f(const_cast<B&>(b));
}
Działa to również, ale jeśli jest to hak. Czy istnieje proste i czyste rozwiązanie?
Co z 'A & f (B & b) {return f (const_cast(n));}'?Dodanie 'const' nie jest hackerem, a wciąż masz wszystkie gwarancje. Zakładam, że funkcja może zawsze działać na wejściu const, co wydaje się sugerować pytanie. –
Jon
Następnie musiałbym const_cast the output, więc jest w zasadzie taki sam. Ale tak, może to jest bezpieczniejsze. – petersohn