我有一个函数 check_str
为 const char*
和 const char(&)[N]
类型重载。
void check_str(const char*) {
std::cout << "string as pointer!!" << '\n';
}
template <size_t N>
void check_str(const char(&)[N]) {
std::cout << "string as array!!" << '\n';
}
然后,我将 arr_01
声明为 const char[]
:
const char arr_01[] = "Desmond";
当我调用他们时:
check_str("Desmond");
check_str(arr_01);
第一次调用打印"string as pointer!!"
,而第二次调用仍然打印"string as pointer!!"
。
好吧,如果我使用 std::string
或 std::string_view
,它将失去对它们进行分类的意义。
有没有办法为 arr_01
调用参数类型为 const char(&)[N]
的重载函数,以便打印 "string as array!!"
没有指定非类型模板参数?
最佳答案
使用std::array
:
#include <algorithm>
#include <array>
#include <cstddef>
#include <cstdio>
template <std::size_t sz>
[[nodiscard]] constexpr auto to_array(char const (&cstr)[sz]) noexcept {
std::array<char, sz> std_arr;
std::copy_n(cstr, sz, std_arr.data());
return std_arr;
}
void check_str(char const*) {
std::puts("string as pointer!!");
}
template <size_t N>
void check_str(std::array<char, N> const&) {
std::puts("string as array!!");
}
int main() {
auto constexpr arr = to_array("Desmond");
check_str("Desmond");
check_str(arr);
}
关于c++ - 为什么字符串作为指针或字符串作为原始数组总是在重载函数中作为指针调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68509933/