2011-01-13 11 views
7

通常、タイプがconstかどうかを検出する必要がある場合は、ただboost::is_constを使用します。しかし、ネストされた型の恒久性を検出しようとすると、問題に遭遇しました。 constの種類に特化され、次の特性テンプレートを、考えてみましょう:ネストされたタイプの定数の検出

template <class T> 
struct traits 
{ 
    typedef T& reference; 
}; 

template <class T> 
struct traits<const T> 
{ 
    typedef T const& reference; 
}; 

問題はboost::is_consttraits<const T>::referenceconstタイプであることを検出していないようだということです。例えば

std::cout << std::boolalpha; 
std::cout << boost::is_const<traits<int>::reference>::value << " "; 
std::cout << boost::is_const<traits<const int>::reference>::value << std::endl; 

この出力:​​

しないのはなぜそれを出力false true

答えて

13

参照はconstではないため、参照する型はconstです。右、const参照はありません。だから、参照がポインタであると想像してください。違いが理解しやすくなります。int const* constでない、int *constはconstです。 、

cout << boost::is_const< 
      boost::remove_reference<int const&>::type>::value << '\n'; 
4

さてあなたはis_const<int const&>::valueも同様に偽であることを指摘している:

使用remove_referenceは、実際のconst型を取得するには?そうです。このようなものは、このようなテンプレートをデバッグするために試した最初のものの中にあるはずです。あなたはTは、ほとんどの実装で、エラー出力にあるものは何でも買ってあげることをインスタンス化するとき

template < typename T > struct print;

:あなたが利用することができますもう一つは、タイプのプリンタです。

すると、現在の問題を解決するために、これを試してみてください:

is_const< remove_reference< traits<int const>::reference >::type >::value

+1

s/is_cost/is_const / –

6

を参照がconstではないので。 :)

あなたはref-to-constを持っています(おおよそのアナログ、int const*、ここではポインターintconstですが、ポインター自体はありません)。標準ではここで用語を使用していますが、誤解を招く用語である "const ref"は避けています。

参考文献は本質的には初期化しかできず、再バインドされないため変更できませんが、constにはなりません。

boost::remove_referenceのタイプからリファレンスを削除することができます(他の回答に示されているとおり)。

関連する問題