47756


c++のテンプレートで

[code]

    template<class T>
    void print(T &&iterable)
    {
    for(auto && str : iterable)
      std::cout << str << std::endl;
    }
    
[/code]

のような関数テンプレートを作ってテンプレートクラスTにはstd::stringを要素に持ったstd::vectorやstd::dequeなどのようなcontainerクラスだけを受け取るようにしたいのですがどのように書けばよいでしょうか？

[code]

    template<class T>
    void print(T<std::string> &&iterable)
    {
    for(auto && str : iterable)
      std::cout << str << std::endl;
    }
    std::vector<std::string>a({"1","2","3"});
    print<std::vector>(a);
    
[/code]

のように書いたらコンパイルエラーで通りませんでした。


CC BY-SA 4.0
2018-08-23T05:44:44.747
47752
2018-08-24T21:41:00.447
29398
question
c++ templates
c++のテンプレートで特定の型を要素に持ったコンテナ型だけ受けたい


明示的に`std::string`だけを受け取るのではだめなんでしょうか？

[code]

    template<class T>
    void print(T&& iterable) {
        for (std::string&& str : iterable)
            std::cout << str << std::endl;
    }
    
[/code]

> エディタ等の解析の恩恵を受けられるように引数を受ける段階ではじけるようにしたい

各エディタの解析処理依存なので明確に回答しようがないです。一例としては

[code]

    template<class T, typename = std::enable_if_t<std::is_same_v<typename T::value_type, std::string>>>
    void print(T &&iterable) {
        for (auto && str : iterable)
            std::cout << str << std::endl;
    }
    
[/code]

のように[`std::enable_if`](https://cpprefjp.github.io/reference/type_traits/enable_if.html)を使用して有効となる条件を指定することもできます。

> template templateという書き方があることがわかったので一応解決しました。

もちろんある程度はtemplate
templateで解決可能ですが、２番目のtemplate引数が`std::array`のように数値であったり、`std::stack`（コンテナとは呼べない？）のようにコンテナだったりとバラバラなので、一般的には解決できないかと思います。（質問者の要件は満たせたかもしれないが、質問文の要件は満たすことができない回答不能問題です。）


CC BY-SA 4.0
2018-08-23T06:15:02.120
47756
2018-08-24T21:41:00.447
2018-08-24T21:41:00.447
4236
4236
47752
answer