[英]Can C++ functions return a pointer to an array of known length?
我有一個包含const char
s的static constexpr
數組的類,我想通過c_str()
方法提供它:
class my_class {
private:
static constexpr const char c_str_[6] = {'c', 'h', 'a', 'r', 's', '\0'};
public:
static constexpr const char* c_str() {
return c_str_;
}
};
這有效,但有一個不幸的結果:它從類型中刪除指向數組的長度:
decltype(my_class::c_str()) // equivalent to const char*
我真正喜歡的是實現這個目標的一些方法:
decltype(my_class::c_str()) // equivalent to const char[6]
我知道在任何一種情況下返回的對象都是指針; 我只想保留類型中指向數組的長度。 有點像decltype("string literal")
是const char[15]
,而不是const char*
。
有沒有辦法做到這一點?
你的意思是返回對c_str_
的引用?
static constexpr decltype(c_str_)& c_str() { return c_str_; }
要么
static constexpr auto& c_str() { return c_str_; }
如果你想要一個指針,只需將&
交換為*
並返回&c_str_
。
如果要顯式引用類型,請使用別名:
using T = const char[6];
static constexpr T& c_str() { return c_str_; }
或者,如果你真的討厭自己:
static constexpr const char (&c_str())[6] { return c_str_; }
請注意,您不能讓函數按值返回原始數組。
一個現代的替代方案是返回一個string_view
,它基本上是指向字符串和長度的指針的組合。 這允許您的函數的用戶直接訪問長度信息。 並且字符串可以在my_class
中以空終止或非空終止的方式my_class
。
據我string_view
支持constexpr構造函數 。
但是,這不允許簽名const char* c_str()
。 如果您受此約束,則字符串必須以空值終止,以允許調用者檢索長度(通過計數)。
是的,有一種方法,但您的代碼需要進行小的修改,如下所示,
#include <iostream>
#include <type_traits>
class my_class {
private:
static constexpr const char c_str_[6] = {'V', 'a', 'a', 'n', 'i', '\0'};
public:
static constexpr auto c_str() -> const char( &)[6] {
return c_str_;
}
};
int main(int , char *[])
{
std::remove_reference< decltype( my_class::c_str())>::type arr = { 'S', 'a', 'a', 'v', 'i', '\0'};
std::cout<< arr<< " is a beautiful name."<< std::endl;
return 0;
}
輸出: Saavi is a beautiful name.
現在my_class::c_str()
返回引用const char ( &)[6]
。 這個引用非常特殊,因為它只能引用長度為6
且與指針不同的char
類型的常量數組。 現在可以檢索類型信息。
所以std::remove_reference<>::type
來拯救,它的type
可以指向引用的類型是const char[6]
。
為了驗證這一點,我創建了名為arr
const char
數組,它是const char[6]
而沒有指定數組的長度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.