У меня есть следующие две функций шаблона перегрузки:объединяющего сопзЬ T & и T && перегружает
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));
}
Моей первая попытка унифицировать перегруженные через идеальное экспедирование не удалась:
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>&'
Как сделали мою вторую попытку:
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> >)'
Есть ли чистый способ унификации перегрузок, или я должен просто жить с ними?
Вы должны предоставить определение того, что такое 'optional <>'. –
Это в основном игрушечный клон 'boost :: optional'. – fredoverflow
... И все же вопрос стоит, можете ли вы дать определение? У меня такое ощущение, что проблема связана с интерфейсом 'optional' (т. Е. Идеальная пересылка - это решение для' some', вам может потребоваться настроить его, чтобы он соответствовал 'optional') –