假设我有这个函数来修剪 std::string 并决定扩展它,这样它不仅会删除开头和结尾的空格,还会删除我在另一个字符串中传递的任何字符,如空格、换行符和回车。
std::string Trim ( const std::string &In_Original,
const std::string &In_CharsToTrim = " \n\r" );
Run Code Online (Sandbox Code Playgroud)
所以基本上,它会从 In_Original 的开头和结尾删除 In_CharsToTrim 中存在的所有字符。
现在,我必须为 std::string 和 std::wstring 编写此代码。因为我觉得这很荒谬,所以我选择使用模板,它可以工作,但我无法传递默认值,因为 std::wstring 版本必须L" \n\r"作为默认值(注意那里的小 L)。
我试过这个:
template <typename Type> Type Trim ( const Type &In_String,
const Type &In_TrimCharacters );
Run Code Online (Sandbox Code Playgroud)
随着:
template std::string Trim ( const std::string &In_String,
const std::string &In_TrimCharacters = " \n\r" );
template std::wstring Trim ( const std::wstring &In_String,
const std::wstring &In_TrimCharacters = L" \n\r" );
Run Code Online (Sandbox Code Playgroud)
但它没有用。它甚至不编译。
目前,我拥有的是一个单独的函数,用于在没有第二个参数的情况下调用,但这完全是错误的方法:
template <typename Type> Type Trim ( const Type &In_String,
const Type &In_TrimCharacters );
std::string Trim ( const std::string &In_String );
std::wstring Trim ( const std::wstring &In_String );
Run Code Online (Sandbox Code Playgroud)
然后,在这个更简单的 Trim 函数中,我只是调用了完整版本。
所以,基本上,我要问的是这个......:
如何根据模板类型传递不同的默认值?基本上,一种专业化,其中唯一的变化是默认参数......
在这种情况下,std::string ( " \n\r" )在一种情况下通过,而std::wstring ( L" \n\r" )在另一种情况下......
或者……有没有其他方法可以做我想做的事,在这里?
这是我想出的:
template <typename T> struct default_trim_chars;
template<> struct default_trim_chars<std::string> {
static const char* value() { return " \n\r"; }
};
template<> struct default_trim_chars<std::wstring> {
static const wchar_t* value() { return L" \n\r"; }
};
template <typename Type> Type Trim ( const Type &In_String,
const Type &In_TrimCharacters = default_trim_chars<Type>::value()){
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
您也可以声明value为数据成员而不是函数,但这需要constexprC++11。