我遇到以下代码的问题
template<typename... TArgs>
void SomeFunc() {
Foo* data[] = {
Func<TArgs>()..., // <- expand the pack into array but calling Func for each type
nullptr
};
}
Func当然会返回Foo * instance。
如果TArgs为空,那么最后的nullptr是这样的,因此数组的大小永远不会为零,但是在编译代码并使用空模板参数列表实例化SomeFunc的情况下,我得到:
cannot allocate an array of constant size 0
就像nullptr元素从来没有。如果我将数组的声明更改为:
Foo* data[sizeof...(TArgs) + 1] =
错误消息也会改变:
Error 2 error C4789: buffer 'data' of size 8 bytes will be overrun; -4 bytes will be written starting at offset 8
我错过了什么?如果有人可以请我启发,因为我显然已经把这个问题拖了太长时间,可能在这里看不到主要问题。
答案 0 :(得分:2)
只是另一种寻找解决方法的尝试(评论时间过长,所以我只是将其作为答案发布):
struct FooNull {};
template<typename T> Foo* FuncWrapper() { return Func<T>(); }
template<> Foo* FuncWrapper< FooNull >() { return nullptr; }
template<typename... TArgs>
void SomeFuncImpl() {
Foo* data[] = {
FuncWrapper<TArgs>()...
};
}
template<typename... TArgs>
void SomeFunc() {
SomeFuncImpl<TArgs...,FooNull>();
}