2016-04-10 3 views
1

私はGoogleのV8 ECMAScriptエンジン用のバインディングツールキットを開発しています。 このテンプレート機能を考えてみましょう:標準C++ 14でゼロサイズ配列の回避策?

template<class... Types> void call_v8_function(v8::Local<v8::Function> function, 
                Types... args) { 
     ...significant amount of context set-up here... 

     v8::Local<v8::Value> call_args[] = { V8Utils::to_js_value(isolate, args)... }; 

     function->Call(this->context, sizeof...(args), call_args); 
    } 

これは、可変個の引数を取り、ヘルパー関数を使用してV8 :: Valueオブジェクトの配列にマップします。 (引数はto_js_valueによって認識される限り、引数は任意の型を持つことができます)これはGCCまたはClangを使用してコンパイルするとすばらしいことに動作します。

ただし、Visual Studioでは完全に機能しません。このテンプレート関数が追加の引数なしで呼び出されると、サイズ0の配列が宣言されます。 GCCとClangに受け入れられているが、標準ではこれが許可されておらず、Visual Studioは正当にerror C2466: cannot allocate an array of constant size 0を吐き出す。

私はこのアプローチが非常に便利だと思うので、重大なコードの重複につながるので、引数なしの場合の関数を複製する以外に、動作させる方法を探しています。

+2

すでにサイズがゼロの配列を特化した 'std :: array'を試すことができます(そして' std :: array :: data() 'も[fine](http://en.cppreference.com/w/cpp/container/array/data)空の配列の場合 – Rostislav

+0

すごく驚くべきことです。私はそれを受け入れることができるように答えを加えたいですか? – minexew

+0

、...動的に割り当てられた配列を作成する場合は、長さが「0」の配列を宣言することができます。おそらく、 'std :: array'を使用するのが最良の選択です。 –

答えて

5

Cスタイルの配列の代わりに、ゼロサイズの配列を特化したstd::arrayを使用できます。さらに、関数呼び出しの場合、data()メンバーは空の配列の場合はwell-behavedです。