0

例:

template<typename T>
struct type_of {
   typedef boost::mpl::if_<boost::is_pointer<T>,
   typename boost::remove_pointer<T>::type,
   T
   >::type type;
};

int main() {
   int* ip;
   type_of<ip>::type iv = 3; // error: 'ip' cannot appear in a constant-expression
}

ありがとう!

4

2 に答える 2

2

現在の C++ の標準では、少なくともコンパイラ固有のものなしでは、変数の型を取得することはできません (ただしboost::typeof、透過的な方法でこれらのトリックを収集するものを試してください)。

あなたが書いたのは基本的に、型からポインター修飾子を削除するテンプレートです: type_of<int>::typeis intas istype_of<int*>::typeです。

于 2010-09-08T23:12:41.873 に答える
2

それはいけません。コンパイラ固有の拡張機能または Boost の Typeof (一貫したインターフェイスの背後にあるコンパイラ固有の動作を隠します) を使用します。

C++0x では、次のように使用できdecltypeますdecltype(ip) iv = 3;。コンパイラが C++0x のこの側面をサポートしている場合は、幸運です。

于 2010-09-08T23:20:53.860 に答える