C++ - 未调用函数模板专业化
C++ - Function template specialization not being called
我有以下代码:
template<typename T>
bool validate(const T& minimum, const T& maximum, const T& testValue)
{
return testValue >= minimum && testValue <= maximum;
}
template<>
bool validate<const char&>(const char& minimum, const char& maximum, const char& testValue)
{
// Allows comparisons with char arguments, ignoring case
// Localize by calling previously defined function
return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}
第一个模板用于任何输入类型,专门用于文字字符。代码编译并运行 main.cpp 来测试它,但在测试之后,我发现没有调用特化。它调用主模板。我不明白为什么。
当来自主模板的类型模板参数 T
被推导或明确指定为 const char&
时,编译器会选择 template <> bool validate<const char&>
特化。对于调用 validate('a', 'b', 'c')
,T
被推断为 char
,这与专业化的预期不符。
要么为 char
(即不是 const char&
)提供专业化:
template <>
bool validate<char>(const char& minimum, const char& maximum, const char& testValue)
{
return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}
或将重载定义为非模板:
bool validate(char minimum, char maximum, char testValue)
{
return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}
我有以下代码:
template<typename T>
bool validate(const T& minimum, const T& maximum, const T& testValue)
{
return testValue >= minimum && testValue <= maximum;
}
template<>
bool validate<const char&>(const char& minimum, const char& maximum, const char& testValue)
{
// Allows comparisons with char arguments, ignoring case
// Localize by calling previously defined function
return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}
第一个模板用于任何输入类型,专门用于文字字符。代码编译并运行 main.cpp 来测试它,但在测试之后,我发现没有调用特化。它调用主模板。我不明白为什么。
当来自主模板的类型模板参数 T
被推导或明确指定为 const char&
时,编译器会选择 template <> bool validate<const char&>
特化。对于调用 validate('a', 'b', 'c')
,T
被推断为 char
,这与专业化的预期不符。
要么为 char
(即不是 const char&
)提供专业化:
template <>
bool validate<char>(const char& minimum, const char& maximum, const char& testValue)
{
return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}
或将重载定义为非模板:
bool validate(char minimum, char maximum, char testValue)
{
return validate(toupper(minimum), toupper(maximum), toupper(testValue));
}