2

テンプレート機能を持つ-

template <class B>
B getValue (B& map) {
    // implementation ...       
}

この関数にパスa map、のように-

map<string,double> doubleMap;
getValue (doubleMap);

したがって、たとえばこの場合、に従って関数の戻り値を設定する場合は、このを抽出する必要があります 。また、double(または渡されたマップによる他の型)で宣言する場合もあります。これを持っている必要があります..doubledoubleMapvalue map

どうすれば入手できますか?

4

3 に答える 3

8

std::mapkey_typeメンバータイプとを定義しますmapped_type

あなたが欲しいのはB::mapped_typedoubleあなたの場合になります。

于 2012-12-06T09:34:50.857 に答える
2

コンテナを受け取り、typedefを使用してその型引数をエクスポートするテンプレートを作成できます:(一般的なタンプレート引数の型取得の例)

template <typename>
class GetTemplateArgs {};

template <typename ARG1, typename ARG2>
class GetTemplateArgs<std::map<ARG1,ARG2>>
{
  public:
    typedef ARG1 KEY;
    typedef ARG2 DATA;
};

template <class B>
typename GetTemplateArgs<B>::DATA getValue (B& map) {
    // implementation ...       
}

そしてもちろん、マップに対してより具体的にすることができるので、引数としてマップのみを受け取ります。

于 2012-12-06T09:37:46.800 に答える
0

それが役立つ場合に備えて、これが私がそれを行う方法の例です:

    template<typename MapType>
    static auto GetValueOrDefault(const MapType& map, const std::string& key, const typename MapType::mapped_type& defaultVal)
    {
        // Try to find the key
        auto iter = map.find(key);
        
        // If we didn't find it then return the default value
        if (iter == map.end())
            return defaultVal;

        // Return the value
        return iter->second;
    }

これはarnooの答えに似ていますが、私がしなければならなかったもう1つの部分は、関数パラメーターリストの「MapType::mapped_type」の前にキーワード「typename」を追加することでした。

于 2021-12-08T11:02:05.223 に答える