クラステンプレート Test<T,U>
を Test<T,T>
で特殊化してしまえば、手っ取り早く望みの動作を実現できます。
C++
1template<typename T, typename U>
2struct Test {
3 void func(const T&){ std::puts("T"); }
4 void func(const U&){ std::puts("U"); }
5};
6
7template<typename T>
8struct Test<T, T> {
9 void func(const T&){ std::puts("U'"); }
10};
11
12Test<int, double> t0;
13t0.func(42); // T=int
14t0.func(3.14); // U=double
15
16Test<int, int> t1;
17t1.func(100); // T=U=int
https://wandbox.org/permlink/j5I48l571fJMYtLH
かなりトリッキーな書き方になってしまいますが、直接的にメンバ関数オーバーロードTest::func(const T&)
を無効化する方法もあります。(個人的にはクラステンプレート特殊化の方が分かりやすくて好みですね)
C++
1template<typename T, typename U>
2struct Test {
3 template<bool AlwaysTrue = true>
4 std::enable_if_t<!std::is_same_v<T, U> && AlwaysTrue>
5 func(const T&){ std::puts("T"); }
6
7 void func(const U&){ std::puts("U"); }
8};
https://wandbox.org/permlink/f1OcI1x9Tq9hLaIq
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/10 13:49
2018/11/10 14:04
2018/11/10 14:13
2018/11/10 14:20 編集