将可变参数模板参数解压缩为每种类型的数组应用函数

时间:2013-10-20 16:40:50

标签: c++ arrays c++11 variadic-templates

我遇到以下代码的问题

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

我错过了什么?如果有人可以请我启发,因为我显然已经把这个问题拖了太长时间,可能在这里看不到主要问题。

1 个答案:

答案 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>();
}