質問するログイン新規登録

回答編集履歴

7

a

2021/02/13 02:37

投稿

yumetodo
yumetodo

スコア5852

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

2021/02/13 02:37

投稿

yumetodo
yumetodo

スコア5852

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

,

2021/02/12 17:07

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -31,4 +31,4 @@
31
31
 
32
32
  [https://wandbox.org/permlink/HtPC7AcNwwYIXbgC](https://wandbox.org/permlink/HtPC7AcNwwYIXbgC)
33
33
 
34
- なお雑にforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。
34
+ なおforwardしたのは気分の問題です。こう、可変長引数を扱うときはとりあえずforwardしておきたいというか・・・。

4

m

2021/02/12 17:04

投稿

yumetodo
yumetodo

スコア5852

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

2021/02/12 17:03

投稿

yumetodo
yumetodo

スコア5852

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

2021/02/12 17:01

投稿

yumetodo
yumetodo

スコア5852

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

2021/02/12 16:56

投稿

yumetodo
yumetodo

スコア5852

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 0+scalar_count(std::forward<Args>(args)...);
11
+ return std::is_scalar_v<TT> + scalar_count(std::forward<Args>(args)...);
14
12
  }
15
13
 
16
14
  int main (){