3

我有一个check_strconst 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_01const char[]

const char arr_01[] = "Desmond";

当我打电话给他们时:

check_str("Desmond");
check_str(arr_01);

第一个调用打印"string as pointer!!",而第二个调用仍然打印"string as pointer!!"

好吧,如果我使用std::stringor std::string_view,它将失去对它们进行分类的意义。

有没有办法调用具有参数类型的重载函数const char(&)[N]以便在不指定非类型模板参数的情况下arr_01打印?"string as array!!"

4

1 回答 1

3

使用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);
}

Demo

于 2021-07-24T12:50:06.553 回答