我制作了一个AppendLastSlashIfNotExist
函数
今天,我决定制作另一个函数AppendLastBackSlashIfNotExist
wstring AppendLastSlashIfNotExist(__in const wstring& path)
{
if (path == L"/")
{
return path;
}
if (path.size() == 0 || path[path.size() - 1] != L'/')
{
return path + L"/";
}
return path;
}
wstring AppendLastBackSlashIfNotExist(__in const wstring& path)
{
if (path == L"\\")
{
return path;
}
if (path.size() == 0 || path[path.size() - 1] != L'\\')
{
return path + L"\\";
}
return path;
}
是的,很糟糕。只有斜杠 - > BackSlash 是更改。我想删除重复。
wstring AppendLastSlashIfNotExist(__in const wstring& path, bool backSlash)
{
if (path == (backSlash ? L"\\" : L"/"))
{
return path;
}
if (path.size() == 0 || path[path.size() - 1] != (backSlash ? L'\\' : L'/'))
{
return path + (backSlash ? L"\\" : L"/");
}
return path;
}
我整合了它们。删除重复。但是另外一个参数来了。我还是觉得不舒服。 是否有其他方法可以删除重复?例如,通过高阶函数使用 请问。
答案 0 :(得分:6)
template
是解决此类问题的答案:
template<char SLASH_TYPE>
wstring AppendLastSlashIfNotExist(__in const wstring& path)
{
if (path[0] == SLASH_TYPE) // <--- comparing char (not const char*)
{
return path;
}
if (path.size() == 0 || path[path.size() - 1] != SLASH_TYPE)
{
return path + SLASH_TYPE;
}
return path;
}
您需要为此目的稍微改变一下逻辑,因为您发现您正在传递char
而不是const char*
作为模板参数。
该函数将被称为:
y = AppendLastSlashIfNotExist<'/'>(x);
y = AppendLastSlashIfNotExist<'\\'>(x);
答案 1 :(得分:6)
不是传递布尔值来指示斜杠类型,而是可以传递所需的斜杠字符,并且可能有斜杠字符的默认值:
wstring AppendLastSlashIfNotExist(__in const wstring& path,
wchar_t slash = L'\\')
{
// This is superfluous and is handled in next if condition.
/*if (1 == path.length() && path[0] == slash)
{
return path;
}*/
if (path.size() == 0 || path[path.size() - 1] != slash)
{
return path + slash;
}
return path;
}
std::wstring s(L"test");
std::wcout << AppendLastSlashIfNotExist(s) << "\n";
std::wcout << AppendLastSlashIfNotExist(s, L'/') << "\n";
答案 2 :(得分:3)
您应该尝试考虑稍后阅读代码的人。 bool不是可读代码,但AppendLastSlashIfNotExists
和AppendLastBackSlashIfNotExists
是。我的建议是保留这两个功能,然后从它们调用普通功能。
wstring AppendLastSlashIfNotExistInternal(__in const wstring& path, bool backSlash)
{
// as before..
return path;
}
wstring AppendLastBackSlashIfNotExist(__in const wstring& path){
return AppendLastSlashIfNotExistInternal(path, true);
}
wstring AppendLastSlashIfNotExist(__in const wstring& path)
{
return AppendLastSlashIfNotExistInternal(path, false);
}
这样,您仍然可以让以后维护代码的人
答案 3 :(得分:0)
一种解决方案可能是使用带参数的TrimEnd,以便从字符串末尾删除所有不需要的字符:
template<class T>
T TrimEnd( const T& arg, const T& unwantedCharacters )
{
// Do manipulations here using stringstream in order to cut unwanted characters.
}
或者您可以避免使用模板,并使用字符串和wstring参数使用此函数的2个版本。
之后,您只需在结果字符串上附加所需的字符尾部。