我正在学习 C++ 中的函数模板专业化,我的任务是编写一个名为的模板函数,该函数plus
返回它的两个参数的总和,这些参数可能是不同类型的。一个按值接受的版本,另一个按指针接受的版本。作为一个额外的挑战,我被要求重载这个函数,以便它连接两个字符串。
template <typename T1, typename T2> decltype(auto) plus(const T1& a, const T2& b) {
return a + b;
}
template <typename T1, typename T2> decltype(auto) plus(const T1* a, const T2* b) {
return *a + *b;
}
// concatenate two strings
template <>
std::string_view plus<std::string_view, std::string_view> (std::string_view a, std::string_view b) {
return std::string { a } + std::string{ b };
}
问题是我在连接两个字符串的函数的专业化重载上遇到错误。我决定选择std::string_view
over的原因std::string
是,当使用字符串文字 ( const char*
) 调用函数时,它不会解析为接受 aconst *
我猜想将解析 over的第二个定义std::string
。
所以我无法真正弄清楚发生了什么。只是一个疯狂的猜测,但这可能与我调用了两个不同的模板函数有关plus
,但它无法确定我要专门化/重载哪个模板函数?
更新:
问题似乎与模板解析有关。const T*
对于任何字符串文字,始终首选接受的定义。只是想找到解决办法。