c++ - 模板函数中的默认参数值,取决于类型

标签 c++ templates

假设我有这个函数来修剪 std::string 并决定扩展它,这样它不仅会删除开头和结尾的空格,还会删除我在另一个字符串中传递的任何字符,例如空格、换行符和回车符返回。

std::string Trim ( const std::string &In_Original,
  const std::string &In_CharsToTrim = " \n\r" );

基本上,它会从 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 );

连同:

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" );

但是没有用。它甚至无法编译。

目前,我所拥有的是一个单独的函数,用于在没有第二个参数的情况下进行调用,但这是完全错误的方法:

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 );

然后,在这个更简单的 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()){
    /* ... */
}

您还可以将 value 声明为数据成员而不是函数,但这需要 constexpr 和 C++11。

关于c++ - 模板函数中的默认参数值,取决于类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24701894/

相关文章:

C++11 std::begin 不适用于传入模板函数的 int[]

c++ - 使用 32 位无符号整数乘以 64 位数字的算法

c++ - 带有指针和比较器C++的优先级队列

C++ 错误 : 'iterator is not a type'

C++ 3D vector 模板

javascript - 如何在 Genshin 中呈现 javascript 模板?

c++ - 错误 : expected unqualified-id before & token

c++ - 如何从另一个类编辑 QMainWindow UI 小部件?

javascript - 具有特定范围的angularjs部分模板

c++ - 在类模板方法中使用enable_if来检查两个函数参数是否都是std::array或都是std::vector