90526


例1のように非型テンプレートを使って、要素数Nの配列に対する関数テンプレートは作成できますが、さらにテンプレートパラメータパックを使用して、例2のように要素数の違う複数の配列を受け取れるようにしたいです。

[code]

    // 例1
    #include <iostream>
    #include <array>
    
    template <size_t N>
    void func(const char (&s)[N])
    {
      std::cout << s;
    }
    
    int main()
    {
        func("aaa");
    }
    
[/code]

[code]

    // 例2
    template<typename T>
    void print(T t) {
        std::cout << t << std::endl;
    }
    
    template<typename T, typename... Ts>
    void print(T t, Ts... ts) {
        std::cout << t;
        print(ts...);
    }
    
    template <size_t... Ns>
    void func(const char (&s)[Ns]...)
    {
      print(s...);
    }
    
    
    
    int main()
    {
        func("aaa", "bbbb");
    }
    
    
[/code]

例2のコードは以下のエラーでコンパイルエラーになってしまいます。

[code]

    prog.cc:5:30: error: '...' must immediately precede declared identifier
    void func(const char (&s)[Ns]...)
                                 ^~~
                           ...
    prog.cc:7:3: error: call to function 'print' that is neither visible in the template definition nor found by argument-dependent lookup
      print(s...);
      ^
    prog.cc:24:5: note: in instantiation of function template specialization 'func<4UL, 4UL>' requested here
        func("aaa", "bbbb");
        ^
    prog.cc:16:6: note: 'print' should be declared prior to the call site
    void print(T t, Ts... ts) {
         ^
    2 errors generated.
    
[/code]

このコードをコンパイルできるようにするにはどのように修正すればよいでしょうか？  
funcのコードを以下のパターンでもで試しましたが、いずれもダメでした。

[code]

    template <size_t... Ns>
    void func(const char (&s)[Ns...])
    {
      print(s...);
    }
    
    template <size_t... Ns>
    void func(const char (&s...)[Ns])
    {
      print(s...);
    }
    
    template <size_t... Ns>
    void func(const char... (&s)[Ns])
    {
      print(s...);
    }
    
    
[/code]

そもそも、要素数の違う複数の配列を受け取る関数テンプレートの作成は可能でしょうか？


CC BY-SA 4.0
2022-08-12T05:45:26.210
90519
2022-08-12T08:31:42.087
53827
question
c++ templates clang
複数の要素数の違う同じ型の配列を受け取る関数テンプレートを作りたいです。


正解はここでした。

[code]

    template <size_t... Ns>
    void func(const char (&... s)[Ns])
    {
      print(s...);
    }
    
    
[/code]

こっちのほうが見やすい

[code]

    template <size_t N>
    using CharArray = char[N];
     
    template <size_t... Ns>
    void func(CharArray<Ns>&... s)
    {
      print(s...);
    }
    
[/code]


CC BY-SA 4.0
2022-08-12T08:31:42.087
90526
2022-08-12T08:31:42.087
53827
90519
answer