回答編集履歴
7
a
    
        answer	
    CHANGED
    
    | @@ -54,4 +54,26 @@ | |
| 54 54 | 
             
            }
         | 
| 55 55 | 
             
            ```
         | 
| 56 56 |  | 
| 57 | 
            -
            [https://wandbox.org/permlink/neebnlPQdWGOdtBN](https://wandbox.org/permlink/neebnlPQdWGOdtBN)
         | 
| 57 | 
            +
            [https://wandbox.org/permlink/neebnlPQdWGOdtBN](https://wandbox.org/permlink/neebnlPQdWGOdtBN)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
            ---
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            追記
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            単項畳込みでpackがない場合は不適格という指摘があったので変更
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            ```cpp
         | 
| 66 | 
            +
            #include <type_traits>
         | 
| 67 | 
            +
            #include <cstddef>
         | 
| 68 | 
            +
            template<typename  ...Args>
         | 
| 69 | 
            +
            constexpr std::size_t scalar_count(Args&&...){
         | 
| 70 | 
            +
                return ( std::is_scalar_v<Args> + ... + 0 );
         | 
| 71 | 
            +
            }
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            int main (){
         | 
| 74 | 
            +
                class cls{} c;
         | 
| 75 | 
            +
                static_assert(2 == scalar_count(1,c,2));
         | 
| 76 | 
            +
            }
         | 
| 77 | 
            +
            ```
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            [https://wandbox.org/permlink/jMUdH7zizHR8Dx0j](https://wandbox.org/permlink/jMUdH7zizHR8Dx0j)
         | 
6
fold
    
        answer	
    CHANGED
    
    | @@ -31,4 +31,27 @@ | |
| 31 31 |  | 
| 32 32 | 
             
            [https://wandbox.org/permlink/HtPC7AcNwwYIXbgC](https://wandbox.org/permlink/HtPC7AcNwwYIXbgC)
         | 
| 33 33 |  | 
| 34 | 
            -
            なおforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。
         | 
| 34 | 
            +
            なおforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            ---
         | 
| 37 | 
            +
             | 
| 38 | 
            +
             | 
| 39 | 
            +
            追記
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            そういえばfold expressionなんて物もあった。もっとシンプルになったし、再帰上限もきにしなくていい。
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            ```cpp
         | 
| 44 | 
            +
            #include <type_traits>
         | 
| 45 | 
            +
            #include <cstddef>
         | 
| 46 | 
            +
            template<typename  ...Args>
         | 
| 47 | 
            +
            constexpr std::size_t scalar_count(Args&&...){
         | 
| 48 | 
            +
                return ( std::is_scalar_v<Args> + ... );
         | 
| 49 | 
            +
            }
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            int main (){
         | 
| 52 | 
            +
                class cls{} c;
         | 
| 53 | 
            +
                static_assert(2 == scalar_count(1,c,2));
         | 
| 54 | 
            +
            }
         | 
| 55 | 
            +
            ```
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            [https://wandbox.org/permlink/neebnlPQdWGOdtBN](https://wandbox.org/permlink/neebnlPQdWGOdtBN)
         | 
5
,
    
        answer	
    CHANGED
    
    | @@ -31,4 +31,4 @@ | |
| 31 31 |  | 
| 32 32 | 
             
            [https://wandbox.org/permlink/HtPC7AcNwwYIXbgC](https://wandbox.org/permlink/HtPC7AcNwwYIXbgC)
         | 
| 33 33 |  | 
| 34 | 
            -
            なお | 
| 34 | 
            +
            なおforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。
         | 
4
m
    
        answer	
    CHANGED
    
    | @@ -29,4 +29,6 @@ | |
| 29 29 | 
             
            }
         | 
| 30 30 | 
             
            ```
         | 
| 31 31 |  | 
| 32 | 
            -
            [https://wandbox.org/permlink/HtPC7AcNwwYIXbgC](https://wandbox.org/permlink/HtPC7AcNwwYIXbgC)
         | 
| 32 | 
            +
            [https://wandbox.org/permlink/HtPC7AcNwwYIXbgC](https://wandbox.org/permlink/HtPC7AcNwwYIXbgC)
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            なお雑にforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。
         | 
3
desc
    
        answer	
    CHANGED
    
    | @@ -1,4 +1,17 @@ | |
| 1 | 
            +
            直接的な問題は宣言の順序にあります。つまり
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            ```cpp
         | 
| 4 | 
            +
            template<typename TT>
         | 
| 5 | 
            +
            constexpr size_t scalar_count(const TT){
         | 
| 6 | 
            +
                    return 0;
         | 
| 7 | 
            +
            }
         | 
| 8 | 
            +
            ```
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            が後で宣言されているために、再帰関数の実体化のときにはオーバーロードの候補に入っていません。前方に移動することでコードは通ります。
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            が、そもそももっとシンプルに書くことができます。`std::is_scalar_v<TT>`で条件分岐する必要はなくて単にそれをそのまま返せば良いです。またせっかくif constexpr文を用いるのならば、引数の数のチェックをそれでやることでオーバーロードを排除できます。このほうが読みやすいですね!
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            ```cpp
         | 
| 2 15 | 
             
            #include <type_traits>
         | 
| 3 16 | 
             
            #include <utility>
         | 
| 4 17 | 
             
            #include <cstddef>
         | 
2
m
    
        answer	
    CHANGED
    
    | @@ -2,9 +2,8 @@ | |
| 2 2 | 
             
            #include <type_traits>
         | 
| 3 3 | 
             
            #include <utility>
         | 
| 4 4 | 
             
            #include <cstddef>
         | 
| 5 | 
            -
            using std::size_t;
         | 
| 6 5 | 
             
            template< typename TT, typename  ...Args>
         | 
| 7 | 
            -
            constexpr size_t scalar_count(TT&&,Args&&...args){
         | 
| 6 | 
            +
            constexpr std::size_t scalar_count(TT&&,Args&&...args){
         | 
| 8 7 | 
             
                if constexpr(sizeof...(Args) == 0)
         | 
| 9 8 | 
             
                    return std::is_scalar_v<TT>;
         | 
| 10 9 | 
             
                else
         | 
| @@ -15,4 +14,6 @@ | |
| 15 14 | 
             
                class cls{} c;
         | 
| 16 15 | 
             
                static_assert(2 == scalar_count(1,c,2));
         | 
| 17 16 | 
             
            }
         | 
| 18 | 
            -
            ```
         | 
| 17 | 
            +
            ```
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            [https://wandbox.org/permlink/HtPC7AcNwwYIXbgC](https://wandbox.org/permlink/HtPC7AcNwwYIXbgC)
         | 
1
simplify
    
        answer	
    CHANGED
    
    | @@ -7,10 +7,8 @@ | |
| 7 7 | 
             
            constexpr size_t scalar_count(TT&&,Args&&...args){
         | 
| 8 8 | 
             
                if constexpr(sizeof...(Args) == 0)
         | 
| 9 9 | 
             
                    return std::is_scalar_v<TT>;
         | 
| 10 | 
            -
                else if constexpr(std::is_scalar_v<TT>)
         | 
| 11 | 
            -
                    return 1+scalar_count(std::forward<Args>(args)...);
         | 
| 12 10 | 
             
                else
         | 
| 13 | 
            -
                    return  | 
| 11 | 
            +
                    return std::is_scalar_v<TT> + scalar_count(std::forward<Args>(args)...);
         | 
| 14 12 | 
             
            }
         | 
| 15 13 |  | 
| 16 14 | 
             
            int main (){
         | 
