2017-04-12 2 views
3

私は長さがゼロの配列を持つレガシーC構造を扱っています。私はそれが有効ではないと思うが、我々はそれと一緒に生きなければならない。 私はマクロを書いていましたが、std :: decayを使って配列をポインタ型に崩壊したいのです。std :: decay長さゼロの配列

しかし、私は長さ0の配列がある場合 - ポインタ型へ

struct data { 
    key[0]; << 
}; 

std::decay<decltype(data::key)> doesntの崩壊を。私は、関数の戻り値の型としてこれを使用しています、そして、それは不平を言う -

GCCエラー:

error: ‘function’ declared as function returning an array

を長さ> = 1

+0

ソースコードを 'T key [0]'から 'T key []'に変更することはできますか? – kennytm

+0

残念ながら私はそれをすることはできません。 std :: remove_extendのT [0]オーバーロードを追加してこの作業を行うことはできますか? – MGH

+2

は 'T [0]' SFINAEコンテキストで、このようなタイプを形成する試みが控除障害を引き起こすため、標準的な要求、非常に奇妙な獣です。これは、通常の配列型を操作するために書かれたTMPコードの大規模な部分は、拡張のようなものをサポートしている実装であっても、それらではうまく動作しないことを意味します。このような –

答えて

0

のその配列は、我々はコンパイラのタイプを聞かせすることができればそれは正常に動作しますテンプレート置換の代わりにテンプレートチェッカーを使用してください。

#include <type_traits> 

template <typename T> 
T* as_ptr(T* x) { return x; } 

template <typename T> 
using DecayToPointer = decltype(as_ptr(std::declval<T>())); 


int main() { 
    static_assert(std::is_same<DecayToPointer<int[0]>, int*>::value, ""); 
    static_assert(std::is_same<DecayToPointer<int[1]>, int*>::value, ""); 
    static_assert(std::is_same<DecayToPointer<int[]>, int*>::value, ""); 
}