我想獲得三個不同的功能,像這樣的呼叫:C++超載靜態常量字符串VS字符數組
foo("aa");
像這樣的人,因爲這樣的電話
char buf[2];
foo(buf);
和一個多種變異之一:
const char *ptr;
//set ptr
foo(ptr);//don't know buffer size at compile time
我試試這個:
//and foo1 for pointers, but how???
template<size_t N>
void foo1(char (&)[N], std::false_type)
{
std::printf("not const\n");
}
template<size_t N>
void foo1(const char (&)[N], std::true_type)
{
std::printf("const\n");
}
template<typename arr_t>
void foo(arr_t arr)
{
foo1(std::forward<arr_t>(arr), std::is_const<typename std::remove_reference<arr_t>::type>{});
}
foo("a");
但它無法編譯,看起來像「一」轉換爲 const char *
不const char (&)[2]
,
,但有趣的是,這樣的代碼編譯好:
template<size_t N>
void f(const char (&)[N])
{
}
f("aaaa");
所以我怎麼能常數之間重載函數在編譯時(在編譯時知道這個常量的大小)和已知大小的數組,但不是const?
爲什麼不你只是使用數組引用版本?那麼你將得到指針版本的編譯失敗。這不是你所追求的嗎?或者你特別想要運行時失敗。 –
'「aa」'類型爲'const char *'。你如何期望與'const char * ptr'區分開來? – dbush
@dbush,no,''aa「'是一個'const char [3]' –