2016-04-15 3 views
1

背景 、C++ 11の配列リファレンスを必要とする一部のレガシーAPIへのベクトルを渡します。 は、私は一般的な値で初期化ベクトルを持っていると言うことができます、私はいくつかのデータへのポインタを必要とするインターフェース(レガシー作業API)を扱う場合、通常、私はデータの基本的な配列を渡す任意の方法は、私はGCCを使用していますいくつかのサイズ

uint64_t val = 100; 
std::vector<uint64_t> vect(2, val); 

で始めることができます機能

function_name (&vect[0]); 

に渡すことで、私はまた、ベクターは、これを行い、ベクトル::データメソッド(と思う)を持っていると思います。

しかし、私は奇妙なエラーが発生しています。どのように対処するかはわかりません(適切にキャストしたり、正しくパスする方法がわかりません。

ここにコンパイラエラーがあります。

cannot convert '& vect.std::vector<_Tp, _Alloc>::operator[]<long unsigned 
int, std::allocator<long unsigned int> >(0ul)' (type 
'__gnu_cxx::__alloc_traits<std::allocator<long unsigned int> 
>::value_type* {aka long unsigned int*}') to type 'long unsigned int (&) 
[2]' 

は、私は(ある意味で)それにポインタを渡すしようとしていたが、それは実際に私は多くの形態で私のベクトルに渡すためにしようとした大きさ2の配列への参照を期待していたの推測、および-check(私を判断してはいけない....)

&vect[0] 
static_cast<uint64_t(&)[2]>(&vect[0]) 
// same w/dynamic and reinterpret cast (yes I know it ...not the best idea) 

だから私は行っておりませんので、(私の仕事が唯一の特定のSTDの機能をサポートして配列を作成してのmemcpyを使用してを介してデータをコピーすることによって、問題を解決することができます私たちの処分によるstdライブラリ全体を持っています。つまり、std :: copyなどは意味しません)。

私はそれをいくつかの関数に渡すことができます。それはとてもうれしくて正しく実行されます(私のテストプリントアウトで分かる限り)。

私のベクトルをいくつかの関数に渡して安全にキャストして、このコンパイラエラーを解決する方法はありますか?私は別の変数を作成して内容をコピーしなければならないという事実に悩まされています...可能ならばこれを避けることを望みます。

要求されたよう

、これは私は

Idが列挙されている所有者であるように似ているAPIの署名から示すことができる最も近いです。これで私の最高の刺しある

template<typename T> inline void function_name(Id id, T&) {} 
+0

電話をかけようとしている機能の正確な署名を100%明確にすることはできますか?実際には –

+0

です。 'vector :: data'は'&vect [0] 'を置き換え、エッジケース(空ベクトル、悪い' operator& ')を扱います。 – Jarod42

+0

関数が引数を参照として宣言している場合、参照を渡す必要はありません。値を渡すと、関数が 'void function_name(uint64_t arg);'または 'void function_name(uint64_t & arg);'または 'void function_name()のように宣言されていれば、その値から関数name(vect [0]); const uint64_t & arg); ' – teivaz

答えて

1
template<class T, std::size_t N> 
using arr = T(&)[N]; 

template<std::size_t N, class T> 
arr<T,N> as_array(T* t) { 
    return *reinterpret_cast<T(*)[N]>(t); 
} 

some_func(as_array<2>(vec.data())); 
some_func(as_array<2>(vec.data()+2)); 

データは配列のようにレイアウトされています。

上記のコードは、Tと入力して予期しない方法でプログラムを破棄することを余儀なくされていないという点で、幾分型安全なfascadeの裏にある再解釈を隠しています。あなたはちょうどNを得ることを担当しています。

Live example

関連する問題