3

次のおもちゃのプログラムは、音楽の種類を対応する色に変換します。正常にコンパイルおよび実行されます。COUNTRY予想どおり、 の変換は失敗し、conversion()関数はデフォルトの を返しますWHITE。ただし、テンプレート引数を削除すると<MUSIC, COLOR>、テンプレート引数推定は使用する型を認識しません。控除を機能させるにはどうすればよいですか?

#include <map>
#include <iostream>
#include "boost/assign.hpp"

template<typename Key, typename T>
T convert(const Key &k, const T &d, const std::map<Key, T> &m) {
    typename std::map<Key, T>::const_iterator it = m.find(k);
    return it == m.end() ? d : it->second;
}

enum MUSIC { ROCK, RAP, EDM, COUNTRY };
enum COLOR { RED, BLUE, ORANGE, WHITE };

int main()
{
    COLOR c = convert<MUSIC, COLOR>(COUNTRY, WHITE,
        boost::assign::map_list_of (RAP, RED) (EDM, BLUE) (ROCK, RED));
    std::cout << c << std::endl;
}
4

2 に答える 2

3

Yakk彼の答え で述べているように、そうでboost::assign::map_list_ofはありませんstd::mapが、1つに変換できます。関数を変更したくない場合は、マップの作成方法を変更できます。C++ では、オブジェクトの構築に使用できる初期化子リストがあります。初期化子リストを使用して変更できます

COLOR c = convert<MUSIC, COLOR>(COUNTRY, WHITE,
    boost::assign::map_list_of (RAP, RED) (EDM, BLUE) (ROCK, RED));

COLOR c = convert(COUNTRY, WHITE, {{RAP, RED},{EDM, BLUE},{ROCK, RED}});

これにより、同じ結果が得られ、テンプレートタイプの推定が機能します。

実際の例

于 2015-07-16T19:28:19.230 に答える