回答編集履歴

7

a

2021/02/13 02:37

投稿

yumetodo
yumetodo

スコア5852

test CHANGED
@@ -111,3 +111,47 @@
111
111
 
112
112
 
113
113
  [https://wandbox.org/permlink/neebnlPQdWGOdtBN](https://wandbox.org/permlink/neebnlPQdWGOdtBN)
114
+
115
+
116
+
117
+ ---
118
+
119
+
120
+
121
+ 追記
122
+
123
+
124
+
125
+ 単項畳込みでpackがない場合は不適格という指摘があったので変更
126
+
127
+
128
+
129
+ ```cpp
130
+
131
+ #include <type_traits>
132
+
133
+ #include <cstddef>
134
+
135
+ template<typename ...Args>
136
+
137
+ constexpr std::size_t scalar_count(Args&&...){
138
+
139
+ return ( std::is_scalar_v<Args> + ... + 0 );
140
+
141
+ }
142
+
143
+
144
+
145
+ int main (){
146
+
147
+ class cls{} c;
148
+
149
+ static_assert(2 == scalar_count(1,c,2));
150
+
151
+ }
152
+
153
+ ```
154
+
155
+
156
+
157
+ [https://wandbox.org/permlink/jMUdH7zizHR8Dx0j](https://wandbox.org/permlink/jMUdH7zizHR8Dx0j)

6

fold

2021/02/13 02:37

投稿

yumetodo
yumetodo

スコア5852

test CHANGED
@@ -65,3 +65,49 @@
65
65
 
66
66
 
67
67
  なおforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。
68
+
69
+
70
+
71
+ ---
72
+
73
+
74
+
75
+
76
+
77
+ 追記
78
+
79
+
80
+
81
+ そういえばfold expressionなんて物もあった。もっとシンプルになったし、再帰上限もきにしなくていい。
82
+
83
+
84
+
85
+ ```cpp
86
+
87
+ #include <type_traits>
88
+
89
+ #include <cstddef>
90
+
91
+ template<typename ...Args>
92
+
93
+ constexpr std::size_t scalar_count(Args&&...){
94
+
95
+ return ( std::is_scalar_v<Args> + ... );
96
+
97
+ }
98
+
99
+
100
+
101
+ int main (){
102
+
103
+ class cls{} c;
104
+
105
+ static_assert(2 == scalar_count(1,c,2));
106
+
107
+ }
108
+
109
+ ```
110
+
111
+
112
+
113
+ [https://wandbox.org/permlink/neebnlPQdWGOdtBN](https://wandbox.org/permlink/neebnlPQdWGOdtBN)

5

,

2021/02/12 17:07

投稿

yumetodo
yumetodo

スコア5852

test CHANGED
@@ -64,4 +64,4 @@
64
64
 
65
65
 
66
66
 
67
- なお雑にforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。
67
+ なおforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。

4

m

2021/02/12 17:04

投稿

yumetodo
yumetodo

スコア5852

test CHANGED
@@ -61,3 +61,7 @@
61
61
 
62
62
 
63
63
  [https://wandbox.org/permlink/HtPC7AcNwwYIXbgC](https://wandbox.org/permlink/HtPC7AcNwwYIXbgC)
64
+
65
+
66
+
67
+ なお雑にforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。

3

desc

2021/02/12 17:03

投稿

yumetodo
yumetodo

スコア5852

test CHANGED
@@ -1,3 +1,29 @@
1
+ 直接的な問題は宣言の順序にあります。つまり
2
+
3
+
4
+
5
+ ```cpp
6
+
7
+ template<typename TT>
8
+
9
+ constexpr size_t scalar_count(const TT){
10
+
11
+ return 0;
12
+
13
+ }
14
+
15
+ ```
16
+
17
+
18
+
19
+ が後で宣言されているために、再帰関数の実体化のときにはオーバーロードの候補に入っていません。前方に移動することでコードは通ります。
20
+
21
+
22
+
23
+ が、そもそももっとシンプルに書くことができます。`std::is_scalar_v<TT>`で条件分岐する必要はなくて単にそれをそのまま返せば良いです。またせっかくif constexpr文を用いるのならば、引数の数のチェックをそれでやることでオーバーロードを排除できます。このほうが読みやすいですね!
24
+
25
+
26
+
1
27
  ```cpp
2
28
 
3
29
  #include <type_traits>

2

m

2021/02/12 17:01

投稿

yumetodo
yumetodo

スコア5852

test CHANGED
@@ -6,11 +6,9 @@
6
6
 
7
7
  #include <cstddef>
8
8
 
9
- using std::size_t;
10
-
11
9
  template< typename TT, typename ...Args>
12
10
 
13
- constexpr size_t scalar_count(TT&&,Args&&...args){
11
+ constexpr std::size_t scalar_count(TT&&,Args&&...args){
14
12
 
15
13
  if constexpr(sizeof...(Args) == 0)
16
14
 
@@ -33,3 +31,7 @@
33
31
  }
34
32
 
35
33
  ```
34
+
35
+
36
+
37
+ [https://wandbox.org/permlink/HtPC7AcNwwYIXbgC](https://wandbox.org/permlink/HtPC7AcNwwYIXbgC)

1

simplify

2021/02/12 16:56

投稿

yumetodo
yumetodo

スコア5852

test CHANGED
@@ -16,13 +16,9 @@
16
16
 
17
17
  return std::is_scalar_v<TT>;
18
18
 
19
- else if constexpr(std::is_scalar_v<TT>)
20
-
21
- return 1+scalar_count(std::forward<Args>(args)...);
22
-
23
19
  else
24
20
 
25
- return 0+scalar_count(std::forward<Args>(args)...);
21
+ return std::is_scalar_v<TT> + scalar_count(std::forward<Args>(args)...);
26
22
 
27
23
  }
28
24