1

我对以下代码有疑问

template<typename... TArgs>
void SomeFunc() {
   Foo* data[] = {
     Func<TArgs>()..., // <- expand the pack into array but calling Func for each type
     nullptr
   };
}

Func 当然返回 Foo* 实例。

最后的 nullptr 是针对 TArgs 为空的情况,因此数组的大小永远不会为零,但是尽管在编译代码并使用空模板参数列表实例化 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

我错过了什么?如果有人可以请赐教,因为我显然在这个问题上解决了太久,可能在这里看不到主要问题。

4

1 回答 1

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>();
}
于 2013-10-20T19:21:18.347 回答