【发布时间】:2016-07-31 13:10:51
【问题描述】:
我正在为 Google 的 V8 ECMAScript 引擎开发一个绑定工具包。 考虑这个模板函数:
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 用于空数组) -
太棒了,这正是我所需要的。要添加答案以便我接受吗?
-
,...或者创建一个动态分配的数组,你可以声明这样的数组长度为
0。虽然使用std::array可能是您的最佳选择。
标签: c++ arrays visual-c++ c++14 variadic-templates