2016-04-10 21 views
1

Google'ın V8 ECMAScript motoru için bir bağlayıcı araç seti geliştiriyorum.Standart C++ 14'te sıfır boyutlu diziler için geçici çözüm?

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); 
    } 

Bu bağımsız değişken bir dizi alır ve bir yardımcı fonksiyonu kullanarak v8 :: Değer nesneler dizisi onları eşler: bu şablonlu işlevi göz önünde bulundurun. (argümanlar, to_js_value tarafından tanındıkları sürece keyfi türlere sahip olabilirler) Bu, GCC veya Clang'ı kullanarak derlediğimde harika çalışır. Ancak, Visual Studio'da, tamamen bozuluyor. Bu templated işlevi herhangi bir ek argüman olmadan çağrıldığında, 0 büyüklüğünde bir dizi bildirilir. GCC ve Clang tarafından kabul edilirken, standart buna izin vermez ve Visual Studio haklı olarak error C2466: cannot allocate an array of constant size 0'u tükürür.

Bu yaklaşımın çok uygun olduğunu düşündüğümden, önemli bir kod çoğaltmasına yol açacağı için, argüman olmayan durumun işlevini çoğaltmanın dışında, çalışmasını sağlamanın bir yolunu arıyorum.

+2

Zaten sıfır boyutlu diziler için bir uzmanlığa sahip olan std :: array 'deneyebilirsiniz (ve 'std :: array :: data()' da [fine] görünüyor (http://en.cppreference.com) Boş diziler için/w/cpp/container/array/data) – Rostislav

+0

Şaşırtıcı, tam da ihtiyacım olan şey bu. Cevap eklemek ister misin? – minexew

+0

, ... veya dinamik olarak ayrılmış bir dizi oluşturmak için, bu tür dizileri "0" uzunluğunda bildirebilirsiniz. 'Std :: array' kullanmak muhtemelen en iyi seçimdir. –

cevap

5

C stili dizilim yerine, sıfır boyutlu diziler için zaten bir uzmanlığa sahip olan bir std::array kullanabilirsiniz. Ayrıca, işlev çağrısı için data() üye de boş diziler için well-behaved olduğunu.

İlgili konular