0

私は機能を持っています(実際には部分的に特化しています)

template<typename T>
T generate(){

}

それを使用するには、暗黙的にテンプレート型を入力する必要があります。

int v = generate<int>();

nここで、出力イテレータを取得し、この関数を使用して値を生成する関数を書きたいと思います。

template<typename OI>
fill(size_t n, OI it){

    for(size_t i = 0; i < n; ++i){
        *(it++) = generate<__TYPE???__>();
    }
}

私は、実際に値を持つイテレータの場合、それが指摘されていることを知っていますvalue_type。しかし、たとえばback_insert_iterator value_typeis void になった場合、それは私が望んでいることではありません。

それで、このタイプを取得する方法はありますか?

4

2 に答える 2

3

出力イテレータは意図的に . を持つ必要はありませんvalue_type。シーケンスに挿入できる型を自動的に取得することはできません。特定の反復子に対して、複数のファーストクラスのシーケンス型が存在する場合もあります。

回避策の 1 つは、関数で使用される反復子がメンバーを提供するvalue_typeか、有用な* iterator逆参照操作を持つことを要求することです。しかし、あなたが観察したように、std::back_insert_iteratorこれらの要件に失敗します。

より良い代替手段は、2 つのテンプレート パラメーターを使用することです。

template<typename T, typename OI>
fill(size_t n, OI it);

これは の控除を許可しないTので、必要です

fill< int >( intvec.size(), std::back_inserter( intvec ) );
//    ^^^ explicit, but the iterator type is still deduced
于 2013-03-08T09:27:13.843 に答える
2

戻り値を使用する代わりに参照を出力パラメーターとして受け取るように変更できる場合generate()、コンパイラーは、渡されたものに基づいて、型が何であるかを判断できます。

template<typename T>
void generate(T &value)
{
    value = ...;
}

.

int v;
generate(v);

.

generate(*(it++));
于 2013-03-08T09:15:21.367 に答える