2015-10-24 5 views
6

これを実装したり、コンテナを使用する方法は他にもあります。これは私の好奇心を満たすためだけです。私は、次のコードがあるとします。参照渡し配列 - 大きな配列のサブセット

void byref(int (&a)[5]); 

int main() 
{ 
    int a[5]; 
    byref(a); 
} 

利点参照することによってCスタイルの配列を渡すのは、sizeof意志std::endとして、その上で動作することです。しかし、今はちょうどこのサイズの配列を渡すことが可能です。

大きな配列のサブセットをこの関数に参照渡しすることはできますか?たとえば、私はしたいと思います:

int main() 
{ 
    int a[10]; 
    byref(a + 1); 
} 

この作業を行う方法はありますか?

私はVS2015で期待値を与え、それはビルドして実行するようになったが、もちろん、コードは非常に危険ななります

byref(reinterpret_cast<int(&)[5]>(*(a + 1))); 
+1

'array_view'を使用してください。 –

+1

@KarolyHorvath、OPは、これを実装したり、コンテナを使用する他の方法があることを知っています。 –

+0

С++でテンプレートを使うことができます: 'template void byref(int(&a)[N]);' – Constructor

答えて

1

私は機能にキャスト探し悪いを包むだけのアイデアを持っている:

#include <iostream> 
#include <cassert> 

void byref(int (&a)[5]) 
{ 
    std::cout << "Hello!" << std::endl; 
} 

template <size_t M, class T, size_t N> 
T (&subarray(T (&a)[N], size_t start))[M] 
{ 
    assert(start < N && start + M <= N); 
    return reinterpret_cast<T(&)[M]>(a[start]); 
} 

int main() 
{ 
    int a[5], b[8]; 
    byref(a); 
    byref(subarray<5>(subarray<6>(b, 0), 1)); 
} 
0

このプロトタイプでは、キャストよりも先に進める別の方法はありません。

通常、私はこの番号も参照してください:byref((int(&)[5])*(b + 5));、もちろんそれはあなたと同じで安全性は低いです。

だから、私はそれを行うには明確ではありません(マクロ多分を除く)。私はここであなたが何かを見逃しているかどうかを確認するために、あなたの質問をupvoteします!

関連する問題