プロジェクトで働いているヘルパー関数を書いています。私は常に型の演算子が欲しかった。私はそれが私の現在の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のバグフィーチャを使用しています ")。 私は不運ですか?
"私は常にtypeof演算子を必要としていましたが、現在のIDE(visual studio '10)には存在しないことを知っています*"はい、それは['decltype'](http:// msdn.microsoft.com/en-us/library/dd537655.aspx)。 – ildjarn
@ildjarn私はあなたに感謝します。私はそれを見落とした方法を知らない。最初の質問は...? – Shaggi
私はあなたが探している答えがわかりません。構文は違法です - 違法だと知りたいのですが?私はISO C++委員会にいない人は誰も、その質問に合理的に答えることはできないと思います。 – ildjarn