使用模板处理字符串和字符串

Igo*_*gor 2 c++ templates template-meta-programming c++17

我有以下两个功能:

void bar(const std::string &s)
{
    someCFunctionU(s.c_str());
}

void bar(const std::wstring &s)
{
    someCFunctionW(s.c_str());
}
Run Code Online (Sandbox Code Playgroud)

这两个都调用一些C函数,分别接受const char *const wchar_t *具有U或具有W后缀。我想创建一个模板函数来处理这两种情况。我尝试了以下尝试:

template <typename T>
void foo(const std::basic_string<T> &s)
{
    if constexpr (std::is_same_v<T, char>)
        someCFunctionU(s.c_str());
    else
        someCFunctionW(s.c_str());
}
Run Code Online (Sandbox Code Playgroud)

但这似乎无法正常工作。如果我打电话给:

foo("abc");
Run Code Online (Sandbox Code Playgroud)

这将无法编译。这是为什么?为什么编译器不能推断出正确的类型Tchar?是否可以创建一个可以处理std :: string和std :: wstring的函数?

max*_*x66 5

这将无法编译。这是为什么?为什么编译器无法将正确的类型T推论为char?

正如其他人更好地解释的那样,"abc"a是一个char[4],因此可以转换为a std::basic_string<char>但不是a std::basic_string<char>,因此无法推断出接受a的模板函数的T类型。charstd::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 ?
}
Run Code Online (Sandbox Code Playgroud)

或者,更多合成但效率更低

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 ?
}
Run Code Online (Sandbox Code Playgroud)

所以,你应该能够调用foo()std::stringstd::wstringchar *wchar_t *char[]wchar_t[]