回答編集履歴

3

参考例のコードを追加

2021/05/13 13:52

投稿

SaitoAtsushi
SaitoAtsushi

スコア5675

test CHANGED
@@ -19,3 +19,109 @@
19
19
 
20
20
 
21
21
  古い仕様ではオプショナルな仕様として `export` キーワードがありましたが、実装した処理系がごく一部しかなかったこともあって C++11 で完全に廃止されました。
22
+
23
+
24
+
25
+ # 参考例
26
+
27
+
28
+
29
+ 肝心なことは
30
+
31
+
32
+
33
+ - 配列大きさは型の一部。 この場合は省略できない。
34
+
35
+ - メンバ関数の部分特殊化はできない。 補助的なクラステンプレートを作って部分特殊化をするのが典型的な方法。
36
+
37
+
38
+
39
+ です。
40
+
41
+
42
+
43
+ mbed の開発環境を用意していないのでとりあえず雰囲気だけですが、型によって呼び分ける例を書いてみました。 与えられる型によって呼び分けられていることはわかると思います。
44
+
45
+
46
+
47
+ ```cpp
48
+
49
+ #include <iostream>
50
+
51
+
52
+
53
+ class serial_writer {
54
+
55
+ private:
56
+
57
+ template<class T, std::size_t N>
58
+
59
+ struct helper {
60
+
61
+ static void write(T (&send)[N]) {
62
+
63
+ std::cout << "write(generic version)" << std::endl;
64
+
65
+ }
66
+
67
+ };
68
+
69
+ template<std::size_t N>
70
+
71
+ struct helper<double, N> {
72
+
73
+ static void write(double (&send)[N]) {
74
+
75
+ std::cout << "write(double version)" << std::endl;
76
+
77
+ }
78
+
79
+ };
80
+
81
+ template<std::size_t N>
82
+
83
+ struct helper<float, N> {
84
+
85
+ static void write(float (&send)[N]) {
86
+
87
+ std::cout << "write(float version)" << std::endl;
88
+
89
+ }
90
+
91
+ };
92
+
93
+
94
+
95
+ public:
96
+
97
+ template<class T, std::size_t N> void write(T (&send)[N]) {
98
+
99
+ helper<T, N>::write(send);
100
+
101
+ }
102
+
103
+ };
104
+
105
+
106
+
107
+ int main(void) {
108
+
109
+ int foo[10];
110
+
111
+ double bar[20];
112
+
113
+ float baz[30];
114
+
115
+
116
+
117
+ serial_writer writer;
118
+
119
+ writer.write(foo);
120
+
121
+ writer.write(bar);
122
+
123
+ writer.write(baz);
124
+
125
+ }
126
+
127
+ ```

2

ポインタではなく配列に置き換え

2021/05/13 13:52

投稿

SaitoAtsushi
SaitoAtsushi

スコア5675

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- `T` が何者であるかというのはこの `write` が使われるまでわかりません。 ポインタが渡されれば問題なく実体化できる可能性があるからこの時点ではエラーになりませんが、ポインタでないものが渡されればエラーになるでしょう。 そして特殊化したほうについては使われるのを待たずともそれが間違っていることが確定しています。
9
+ `T` が何者であるかというのはこの `write` が使われるまでわかりません。 配列が渡されれば問題なく実体化できる可能性があるからこの時点ではエラーになりませんが、配列でないものが渡されればエラーになるでしょう。 そして特殊化したほうについては使われるのを待たずともそれが間違っていることが確定しています。
10
10
 
11
11
 
12
12
 

1

ポインタではなく配列を意図したコードになっているようなので修正

2021/05/13 11:06

投稿

SaitoAtsushi
SaitoAtsushi

スコア5675

test CHANGED
@@ -1,4 +1,4 @@
1
- `send` が `double` 型だからです。 インデクスを付けることはできません。 `double*` を意図していたのでしょうか? 単純ミスですね。
1
+ `send` が `double` 型だからです。 インデクスを付けることはできません。 `double[]` (`double` の配列) を意図していたのでしょうか? 単純ミスですね。
2
2
 
3
3
 
4
4