63372


こんにちは、C++の初学者です。  
ビャーネ・ストラウストラップ先生の『プログラミング言語C++ 第4版』から以下のexampleを引用しました。  
タグ指名(tag
dispatch)について、関数sort_helperの引数に、「random_access_iterator_tag」や「forward_iterator_tag」などと書くことが許されるのは何故でしょうか。なにか特別な文法なのでしょうか。ご教授願います。

[code]

    #include <iostream>
    #include <vector>
    #include <list>
    #include <iterator>
    using namespace std;
    
    template<typename C>
    using Value_type = typename C::value_type;
    
    template<typename C>
    using Iterator_type = typename C::iterator;
    
    template<typename Iter>
    using Iterator_category = typename std::iterator_traits<Iter>::iterator_category;
    
    template<typename Ran>
    void sort_helper(Ran beg, Ran end, random_access_iterator_tag) {
        sort(beg,end);
    }
    
    template<typename For>
    void sort_helper(For beg, For end, forward_iterator_tag) {
        vector<Value_type<For>> v {beg, end};
        sort(v.begin(),v.end());
        copy(v.begin(),v.end(),beg);
    }
    
    template<typename C>
    void sort(C& c) {
        using Iter = Iterator_type<C>;
        sort_helper(c.begin(),c.end(),Iterator_category<Iter>{});
    }
    
    template<typename C>
    void print(C& c) {
        for (auto p : c) {
            cout << p << " ";
        }
        cout << endl;
    }
    
    int main() {
        vector<int> vec {1,2,4,5,7,8,5,6,98,78,45,12,65};
        list<int> lst {1,2,5,8,9,6,3,4,7,32,65,45,12,13};
        // sort
        sort(vec);
        sort(lst);
        // print
        print(vec);
        print(lst);
    }
    
[/code]


CC BY-SA 4.0
2020-02-26T06:17:03.017
63368
2020-02-26T11:33:35.943
37961
question
c++ c++11
タグ指名の仕組み


[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示")
では関数内部で使わない仮引数は引数名を省略できます ([c](/questions/tagged/c "'c' のタグが付いた質問を表示") は禁止)

[code]

    void func(int f, int g, int) { ... }
    void func(int f, int g, double) { ... }
    
[/code]

と全く同じことで、提示 `sort_helper()`
は引数３つをとる関数で、その３つ目の引数はコンパイル時オーバーロード解決にのみ使い、実行時には使っていないのです。

[code]

    func(x, y, int()); // は先の例の前者を呼ぶ
    func(x, y, traits<T>::value{}); // value 型に適合するほうが呼ばれる
    
[/code]

使われない引数１つを受け渡す実行時オーバーヘッドがかかりますが、それ以上に得られるものがあるとき使われます。


CC BY-SA 4.0
2020-02-26T09:01:49.397
63372
2020-02-26T11:33:35.943
2020-02-26T11:33:35.943
8589
8589
63368
answer