回答編集履歴
3
参考実装追加
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
問題を勘違いしてたので追記
test
CHANGED
@@ -37,3 +37,7 @@
|
|
37
37
|
// 3
|
38
38
|
// not implemented
|
39
39
|
```
|
40
|
+
----
|
41
|
+
回答したあとですみませんが、問題を勘違いしていました。
|
42
|
+
タイトルから非型パラメータで特殊化できないのかと思って、わざわざ型にしたのですが、定数のままでも特殊化できるんですね。
|
43
|
+
まあ参考情報にでもしてください。問題が演算子オーバーロード時の戻り値型と共通化可能なメソッド/演算子なのであれば、継承してあげれば共通化でき、演算子はグローバル定義にでもすれば解決するのではないでしょうか?
|
1
よく見たらintのベクタになってたので他も対応した。
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,
|
12
|
+
template <typename T, typename V, V N>
|
13
|
-
struct VECTOR_<T, integral_constant<
|
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<
|
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<
|
21
|
+
struct VECTOR_<T, integral_constant<int, 3>> {
|
22
22
|
void hoge() {cout << 3 << endl;}
|
23
23
|
};
|
24
|
-
template <typename T,
|
24
|
+
template <typename T, int N>
|
25
|
-
struct VECTOR : VECTOR_<T, integral_constant<
|
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
|
```
|