Mam dwóch następujących funkcji szablonu przeciążeniem:jednoczącym const T & i T && przeciąża
template<typename T>
optional<T> some(const T& x)
{
return optional<T>(x);
}
template<typename T>
typename std::enable_if<std::is_rvalue_reference<T&&>::value, optional<T> >::type
some(T&& x)
{
return optional<T>(std::move(x));
}
Moja pierwsza próba ujednolicenia przeciążeń za pośrednictwem doskonałego spedycji failed:
template<typename T>
optional<T> some(T&& x)
{
return optional<T>(std::forward<T>(x));
}
error: forming pointer to reference type 'const std::basic_string<char>&'
jak moja druga próba:
template<typename T>
optional<typename std::remove_reference<T>::type> some(T&& x)
{
return optional<typename std::remove_reference<T>::type>(std::forward<T>(x));
}
error: no matching function for call to
'std::basic_string<char>::basic_string(gpa::optional<const std::basic_string<char> >)'
Czy istnieje czysty sposób na zunifikowanie przeciążenia, czy powinienem po prostu żyć z ich posiadaniem?
Powinieneś podać definicję tego, czym jest "opcjonalne <>". –
Jest to w zasadzie zabawkowy klon 'boost :: optional'. – fredoverflow
... A jednak pytanie brzmi: czy możesz podać definicję? Mam wrażenie, że problemem jest interfejs "opcjonalny" (tzn. Idealne przekazywanie jest rozwiązaniem dla "niektórych", może być konieczne dostosowanie go do "opcjonalne"). –