簡體   English   中英

如何減小數組參數的大小?

[英]How can I reduce the size of an array argument?

我有一個模板函數bar,它將對數組的引用作為參數。 我想將參數傳遞給另一個函數,但前提是將數組的大小減一,然后跳過數組的第一個元素。

#include <iostream>

template <typename T>
void foo(const T& t)
{
  std::cout << sizeof(t) << std::endl;
  std::cout << t[0] << std::endl;
}

template <typename T>
void bar(const T& t)
{
  std::cout << sizeof(t) << std::endl;
  std::cout << t[0] << std::endl;
  foo(t); // Magic is desired here!
}

int main()
{
  char array[] = "ABCD";
  bar(array);
}

上面打印出:

5
A
5
A

我希望將其打印出來:

5
A
4
B

您可以使用兩個模板參數來執行此操作,一個用於數組類型,一個用於數組大小。

template <typename T, int N>
void bar(const T (&t)[N])
{
    // ...
    foo(reinterpret_cast<const T(&)[N-1]>(t[1]));
}

復制數組可能是獲取參考所必需的。 我希望這個答案能引起您對問題真正主題的關注。

用適當外觀(和通用)的強制轉換調用foo如下所示

reinterpret_cast<typename std::remove_reference<decltype(t[0])>::type [sizeof(t)-1]>(t+1)

但以上內容無效-您無法將const char *強制轉換為const char [4]; 另外,由於無法復制構造數組,因此無法以其他方式獲取引用。 因此,您可能需要在c ++ 11中復制或使用std :: array,這實際上歸結為具有兩個模板參數。

但是,這是一個有效的解決方案:

typedef typename std::remove_reference<decltype(t[0])>::type  element_type;
foo(reinterpret_cast<element_type(&) [sizeof(T)-1]>(t[1]));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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