CodeGearRADStudioでdecltypeを使用していくつかのコードに取り組んでいます。私は素朴な解決策を試しましたが、これはこれと同じように見えます:
int main(int, char**) {
int i;
int &ir = i;
decltype((ir)) ir_clone = ir;
}
もちろん、これはコンパイルに失敗します:内部コンパイラエラー。そのコードには特に問題はなく、参照式に関するコンパイラのバグがあるのではないかと思います。(ちなみに、g ++はコードに問題がなく、正常にコンパイルされます。)ただし、プラットフォームはネゴシエートできないため、問題の解決には役立ちません。
上記の場合、私は
decltype(ir) ir_clone = ir; /* No extra parens */
コンパイルされ、期待どおりに機能します。ただし、環境から定数を正しく計算できないため、問題はそれだけではありません。特に:
struct S { int i; } s;
const S* p = &s;
decltype(p->i) i0 = s.i; /* i0 is an int */
decltype((p->i)) i1 = s.i; /* i1 is a const int& */
引数を式にするためにparensを使用しないと、必要な引数の一貫性が失われます。
私が使用できるもう1つのツールは、次のような単純なテンプレートです。
template<class T> struct unref { typedef T type; }
template<class T> struct unref<T&> { typedef T type; }
これにより、を使用して、型の参照部分を取り除くことができますunref<int&>::type
。
私が理解できないように見えるのは、これらすべてのツールを組み合わせて、必要なタイプの式を成功させる方法です。必要なことの1つとして、「foreach」を実行する一般化されたマクロに取り組んでいます。(はい、Boostの方が優れていることはわかっています。)次のシナリオを処理する必要があります。
(vector<int>) vi => vector<int>
(vector<int>&)vir => vector<int>
(const vector<int>) cvi => const vector<int>
(const vector<int>&)cvir => const vector<int>
(const P*) cp->vi => const vector<int>
(P*) p->vi => vector<int>
これまでのところ、私の単純な試みは失敗します:
unref<decltype(cp->vi)> /* is vector<int>, not what I need. */
unref<decltype((cp->vi))> /* is const vector<int>, which is right. */
unref<decltype(vir)> /* is vector<int>, which is right. */
unref<decltype((vir))> /* Internal Compiler Error, which is a headache. */
私を正しい軌道に乗せるためのアイデアはありますか?うまくいけば、私が見逃している単純なものがあります。たぶん私は間違った角度から問題を攻撃しています。