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 に答える