簡體   English   中英

C ++函數可以返回指向已知長度數組的指針嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM