это не скомпилируется.Это почему?почему компилятор не может вывести правильный тип T на тип char?
Как лучше объяснено другими, "abc"
- это char[4]
, поэтому он конвертируется в std::basic_string<char>
, но не 't * std::basic_string<char>
, поэтому нельзя вывести тип T
как char
для функции шаблона, которая принимает std::basic_string<T>
.
Возможно ли создать одну функцию, которая быобрабатывать как std :: string и std :: wstring?
Да, это возможно;но что не так с вашим решением с двумя функциями при перегрузке?
В любом случае, если вы действительно хотите одну функцию и если вы согласны писать много казуистики, я полагаю, вы можете написать что-то вроде следующего
template <typename T>
void foo (T const & s)
{
if constexpr ( std::is_same_v<T, std::string> )
someCFunctionU(s.c_str());
else if constexpr ( std::is_convertible_v<T, char const *>)
someCFunctionU(s);
else if constexpr ( std::is_same_v<T, std::wstring> )
someCFunctionW(s.c_str());
else if constexpr ( std::is_convertible_v<T, wchar_t const *> )
someCFunctionW(s);
// else exception ?
}
или, немного более синтетически, но менее эффективно
template <typename T>
void foo (T const & s)
{
if constexpr ( std::is_convertible_v<T, std::string> )
someCFunctionU(std::string{s}.c_str());
else if constexpr (std::is_convertible_v<T, std::wstring> )
someCFunctionW(std::wstring{s}.c_str());
// else exception ?
}
Таким образом, вы сможете звонить foo()
с std::string
, std::wstring
, char *
, wchar_t *
, char[]
или wchar_t[]
.