2012-03-23 53 views
0

プロジェクトで働いているヘルパー関数を書いています。私は常に型の演算子が欲しかった。私はそれが私の現在のIDE(ビジュアルスタジオ'10)に存在しないことを知っているので、私はそれのための実装を書こうとしています。これは次のようなものです:vC++でのTypeof()演算子

auto var = new typeof(<expression>); 

これは、式に基づいてコンパイル時に取り出せる型でなければなりません。 、

#define typeof(expression) (_type_creater().inducer(expression)::type) 

template<typename T> 
class _type_holder{ 
public: 
    typedef T type; 
}; 

class _type_creater{ 
public: 
template< class B > 
    _type_holder<B> inducer(B _temp) { 
     /* Here compiler induces the templated expression and creates a typename out of it. 
      this we can use extract typename from _type_holder, except a instantiatet type apparantly 
      doesn't have access to typedef'd typenames. 
     */ 
     return _type_holder<B>(); 
    } 
}; 

だから、問題は基本的に次のとおりです。

template< typename A > 
void foo(A unused) { 
/* can be invoked like foo(5) with A = int  */ 
    typedef A type; 
    type * used = new type; 
} 

だから私はこのような何かが..私はmacroes、クラスやテンプレートで遊んでできると思っていた:C++はテンプレート引数を誘導する際に、インスタンスのためにこれを使用しています

struct a 
{ 
    typedef int type; 
} 
... 
a mya; 
new mya::type; //or mya.type 

最初の質問は、なぜこれが違法ですか?インスタント・スタイルの型から型名を取得できないのはなぜですか? 2番目の質問、これはまったくできますか?私はTYPEOFを見てみましたが、それほど意識することはできませんでしたし、VCコンパイラ( "//VC7.0の特定のバグフィーチャ"、 "//VC8.0の特定のバグフィーチャ"、 " /これはnice VC6.5とVC7.1のバグフィーチャを使用しています ")。 私は不運ですか?

+3

"私は常にtypeof演算子を必要としていましたが、現在のIDE(visual studio '10)には存在しないことを知っています*"はい、それは['decltype'](http:// msdn.microsoft.com/en-us/library/dd537655.aspx)。 – ildjarn

+0

@ildjarn私はあなたに感謝します。私はそれを見落とした方法を知らない。最初の質問は...? – Shaggi

+0

私はあなたが探している答えがわかりません。構文は違法です - 違法だと知りたいのですが?私はISO C++委員会にいない人は誰も、その質問に合理的に答えることはできないと思います。 – ildjarn

答えて

0

オブジェクトはスコープではありません。スコープ解決演算子(::)は、スコープ(クラススコープ、ネームスペーススコープ、グローバル(ネームスペース)スコープ)にのみ適用されます。私はその質問に対するコメントの中で理論として少しの追加情報を与えた。

関連する問題