回答編集履歴

3

参考実装追加

2024/02/16 07:04

投稿

退会済みユーザー
test CHANGED
@@ -41,3 +41,48 @@
41
41
  回答したあとですみませんが、問題を勘違いしていました。
42
42
  タイトルから非型パラメータで特殊化できないのかと思って、わざわざ型にしたのですが、定数のままでも特殊化できるんですね。
43
43
  まあ参考情報にでもしてください。問題が演算子オーバーロード時の戻り値型と共通化可能なメソッド/演算子なのであれば、継承してあげれば共通化でき、演算子はグローバル定義にでもすれば解決するのではないでしょうか?
44
+
45
+ 参考実装もつけておきます。
46
+ ```C++
47
+ #include <iostream>
48
+ #include <type_traits>
49
+ using namespace std;
50
+ template <typename T, int N>
51
+ struct VECTOR_common {
52
+ T vec[N];
53
+ void hoge() {cout << "hoge" << endl;}
54
+ };
55
+ template <typename T, int N>
56
+ struct VECTOR: VECTOR_common<T,N> {};
57
+ template <typename T, int N>
58
+ VECTOR<T,N> operator+(const VECTOR<T,N>& left, const VECTOR<T,N>& right) {
59
+ cout << "<T,N>" << endl;
60
+ VECTOR<T,N> res(left);
61
+ for (int i = 0; i < N; ++i) res.vec[i] += right.vec[i];
62
+ return res;
63
+ }
64
+ template <typename T>
65
+ VECTOR<T,3> operator+(const VECTOR<T,3>& left, const VECTOR<T,3>& right) {
66
+ cout << "<T,3>" << endl;
67
+ return VECTOR<T,3>();
68
+ }
69
+ int main()
70
+ {
71
+ VECTOR<int, 2> v2;
72
+ VECTOR<int, 3> v3;
73
+ VECTOR<int, 4> v4;
74
+ v2.hoge();
75
+ v3.hoge();
76
+ v4.hoge();
77
+ v2 = v2 + v2;
78
+ v3 = v3 + v3;
79
+ v4 = v4 + v4;
80
+ return 0;
81
+ }
82
+ // hoge
83
+ // hoge
84
+ // hoge
85
+ // <T,N>
86
+ // <T,3>
87
+ // <T,N>
88
+ ```

2

問題を勘違いしてたので追記

2024/02/16 06:49

投稿

退会済みユーザー
test CHANGED
@@ -37,3 +37,7 @@
37
37
  // 3
38
38
  // not implemented
39
39
  ```
40
+ ----
41
+ 回答したあとですみませんが、問題を勘違いしていました。
42
+ タイトルから非型パラメータで特殊化できないのかと思って、わざわざ型にしたのですが、定数のままでも特殊化できるんですね。
43
+ まあ参考情報にでもしてください。問題が演算子オーバーロード時の戻り値型と共通化可能なメソッド/演算子なのであれば、継承してあげれば共通化でき、演算子はグローバル定義にでもすれば解決するのではないでしょうか?

1

よく見たらintのベクタになってたので他も対応した。

2024/02/16 03:50

投稿

退会済みユーザー
test CHANGED
@@ -9,28 +9,31 @@
9
9
  using namespace std;
10
10
  template <typename T, typename U>
11
11
  struct VECTOR_;
12
- template <typename T, T N>
12
+ template <typename T, typename V, V N>
13
- struct VECTOR_<T, integral_constant<T, N>> {
13
+ struct VECTOR_<T, integral_constant<V, N>> {
14
14
  void hoge() {cout << "not implemented" << endl;}
15
15
  };
16
16
  template <typename T>
17
- struct VECTOR_<T, integral_constant<T, 2>> {
17
+ struct VECTOR_<T, integral_constant<int, 2>> {
18
18
  void hoge() {cout << 2 << endl;}
19
19
  };
20
20
  template <typename T>
21
- struct VECTOR_<T, integral_constant<T, 3>> {
21
+ struct VECTOR_<T, integral_constant<int, 3>> {
22
22
  void hoge() {cout << 3 << endl;}
23
23
  };
24
- template <typename T, T N>
24
+ template <typename T, int N>
25
- struct VECTOR : VECTOR_<T, integral_constant<T, N>> {};
25
+ struct VECTOR : VECTOR_<T, integral_constant<int, N>> {};
26
26
  int main()
27
27
  {
28
28
  VECTOR<int, 2> v2;
29
29
  VECTOR<int, 3> v3;
30
+ VECTOR<int, 4> v4;
30
31
  v2.hoge();
31
32
  v3.hoge();
33
+ v4.hoge();
32
34
  return 0;
33
35
  }
34
36
  // 2
35
37
  // 3
38
+ // not implemented
36
39
  ```