2012-01-09 7 views
1

boost::my_map_list_ofの機能を理解する上で問題があります。特にこの部分:boost :: my_map_list_of

operator Map const&() const { return data; } 

どのように動作するか説明できますか?このようにして作成されたマップは、コンパイル時に初期化されますか?以下

全体ブーストある:my_map_list_of()コード:map_list_of_type::operator()が呼び出され、その後

my_map_list_of(1, 'a') 

template<class K, class V> 
struct map_list_of_type { 
    typedef std::map<K, V> Map; 
    Map data; 
    map_list_of_type(K k, V v) { data[k] = v; } 
    map_list_of_type& operator()(K k, V v) { data[k] = v; return *this; } 
    operator Map const&() const { return data; } 
}; 
template<class K, class V> 
map_list_of_type<K, V> my_map_list_of(K k, V v) { 
    return map_list_of_type<K, V>(k, v); 
} 

int main() { 
    std::map<int, char> example = 
    my_map_list_of(1, 'a') (2, 'b') (3, 'c'); 
    cout << example << '\n'; 
} 
+1

に変換され、これは廃止されました。 C言語11では 'std :: map の例を{{1、 'a'}、{2、 'b'}};などと書くことができます。 –

+1

Kerrek SB:初期化リストはMSVC、I –

+1

@ViktorSehr: "obsolescent"、おそらく... –

答えて

1

コードmain()ではmap_list_of_typeオブジェクトを返す関数my_map_list_of()を、呼び出しています戻り値のオブジェクトその関数は同じオブジェクトを返します。

my_map_list_of(1, 'a') (2, 'b'); 
         ^^^^^^^^ 

そして、map_list_of_type::operator()が、新たに返されたオブジェクトに対して再び呼び出されます。

my_map_list_of(1, 'a') (2, 'b') (3, 'c'); 
           ^^^^^^^^ 

次に、map_list_of_type::operator Map const&()が暗黙的に呼び出されます。これは、この割り当てが要求するためです。オブジェクトmap_list_of_type<int,char>ちょうどメモとしてstd::map<int,char>

std::map<int, char> example = my_map_list_of(1, 'a') (2, 'b') (3, 'c'); 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
+0

Ok thxですが、この例ではMap型への変換が必要なのはなぜですか?私はどのようにすべてのコードが動作するかは分かりません。例えば、ある行為者がその行をパススルーしているとします。 "my_map_list_of(1、 'a')(2、 'b')(3、 'c');" 。 – Lsk

関連する問題