私は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
を吐き出す。
私はこのアプローチが非常に便利だと思うので、重大なコードの重複につながるので、引数なしの場合の関数を複製する以外に、動作させる方法を探しています。
すでにサイズがゼロの配列を特化した 'std :: array'を試すことができます(そして' std :: array :: data() 'も[fine](http://en.cppreference.com/w/cpp/container/array/data)空の配列の場合 – Rostislav
すごく驚くべきことです。私はそれを受け入れることができるように答えを加えたいですか? – minexew
、...動的に割り当てられた配列を作成する場合は、長さが「0」の配列を宣言することができます。おそらく、 'std :: array'を使用するのが最良の選択です。 –