2016-09-17 17 views
1

私が書いたコンテナのクラスに対して定数または不定数反復を許可したいと思います。私のコンテナはstd::vectorの要素を非constの参照(elementsと呼んでいる)に格納しています。私は、例えば、これを行うためにブーストのtransform iteratorを使用しています:C++でTからconst Tに変換する関数

ここ
auto begin() const 
{ 
    return boost::make_transform_iterator 
     (elements.begin() 
     , to_const<std::reference_wrapper<ElementType>> 
     ); 
} 

私はconst TにタイプTのオブジェクトを変換するために書いた簡単な関数テンプレートを使用しています:

template <typename T> 
std::add_const<T>::type to_const(T value) { return value; } 

私はそれを知っています私はちょうどstd::add_constに似ていますが、実際の機能としてこれを行うためのSTLまたはBoost関数テンプレートがあるかどうかを知りたいと思っていました。 (あるいは、誰かが遅延ベクトルを遅れて定数ベクトルに遅延変換するより良い方法を知っていれば、さらに良いでしょう。)

答えて

2

C++ 17では、これを行うためのテンプレート関数が<utility>です。 std::as_const<T>、およびBTW、これ(以下)はそれを書く方法ではありません。

template <typename T> 
std::add_const<T>::type to_const(T value) { return value; } 

あなたは一時的なものを許可する値で引数を取っており、コピー/移動コンストラクタの呼び出しが必要な場合があります。以下プロトタイプとしてではなく、lvalue基準を使用(別名、オブジェクトが一時的にできません):

template <typename T> 
constexpr typename std::add_const<T>::type& as_const(T& t) noexcept{ 
    return t; 
} 

又は

template <typename T> 
constexpr std::add_const_t<T>& as_const(T& t) noexcept{ return t; } 
+0

パーフェクト。私がconstexprや参照パラメータのようなものを忘れると、なぜ標準実装を探したかったのですか? :P –

+0

完全性のために、仮引数が 'const'の場合は、引数として引数を渡すことができると言わなければなりません。 –

+0

@ JohannesSchaub-litb、これはForwarding Referenceではないので、明示的なテンプレート引数が[std :: as_const (A()) '**または... **' std :: as_const(static_cast (A())); '](http://coliru.stacked-crooked.com/a/77d58c9af7e711af)...しかし、なぜ誰かがそれをやりたがっていますか? – WhiZTiM

関連する問題