Как заставить преобразование char [] в char * в создании шаблона? - PullRequest
4 голосов
/ 27 апреля 2020

Допустим, у меня есть функция:

#include <optional>

template <typename T>
std::optional<T> foo(T const &input);

Она принимает значение, пытается работать с его копией и возвращает указанную копию в случае успеха (std::nullopt в случае ошибки).

Но проблема в том, что когда строковый литерал передается в такую ​​функцию, возникает ошибка T in optional<T> must meet the Cpp17Destructible requirements.

Это вызвано static_assert(is_object_v<_Ty> && is_destructible_v<_Ty> && !is_array_v<_Ty>, ...), определенным в <optional>.

Следующая Выражение работает правильно:

foo((char const*) "bar");

Это ошибка:

foo("bar");

Вопрос в том, как заставить компилятор неявно преобразовывать char const[] в char const*?

PS Я знаю, что это можно сделать, просто перегрузив функцию, поскольку я не слишком заинтересован в дублировании кода, которое она вызывает, поэтому мне интересно, применимо ли здесь альтернативное решение.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

Редактировать: переписал ответ. С вычетом типа возврата это было бы удобно.

template <typename T>
auto foo(T const &input){
    auto copy {std::move(input)};
    // ...
    return std::optional{std::move(copy)};
}
2 голосов
/ 27 апреля 2020

Не совсем то, что вы просили, хотя учтите, что не нужно много повторений:

template <int s>
std::optional<const char*> foo(const char (&str)[s]) {
    return foo(&str[0]);
}

или проще:

std::optional<char const*> foo(char const *input) { 
    return foo<char const *>(input); 
}
...