![](/img/trans.png)
[英]How can a template function 'know' the size of the array given as template argument?
[英]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.