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)
这将无法编译。这是为什么?为什么编译器不能推断出正确的类型T来char?是否可以创建一个可以处理std :: string和std :: wstring的函数?
这将无法编译。这是为什么?为什么编译器无法将正确的类型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::string,std::wstring,char *,wchar_t *,char[]或wchar_t[]。
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |