質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1562閲覧

[c++] template TとUが同じ時に定義しないようにしたい

azarashi0002

総合スコア8

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/10 12:34

c++で下のコードを組み、使用した際
TとUが同じ型の時エラーを吐きます。

なので片方を定義しないようにすれば良いと考えたのですが、
どのように組めば良いでしょうか?

c++

1template<typename T, typename U> 2struct Test { 3 void func(const T& v){} 4 void func(const U& v){} 5};

なおTとUが同じ型の時、
void func(const U& v){}
の方を実行させたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

クラステンプレート 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:29

編集2018/11/10 13:41
yohhoy

総合スコア6189

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azarashi0002

2018/11/10 13:49

回答有り難うございます Test<T,T>で特殊化は気が付かなかったです (is_sameと同じ仕組みですかね?) 2つ目のAlwaysTrueはどうして必要なのでしょうか?
yohhoy

2018/11/10 14:04

クラステンプレート初期化とis_sameとは全く異なる仕組みですね。 2つ目は、SFINAEを引き起こすためにメンバ関数をテンプレートとする必要があり、そのためのダミーテンプレートパラメータです。
azarashi0002

2018/11/10 14:13

is_sameは template<class _Ty1> struct is_same<_Ty1,_Ty1>:true_type{}; と特殊化されていたのでてっきり同じ仕組みかと... SFINAEを引き起こすのには条件があるのですか... ありがとうございます
yohhoy

2018/11/10 14:20 編集

> [...] と特殊化されていたのでてっきり同じ仕組みかと... あー「is_sameの内部実装方法」とは同じですね。「is_same外部仕様の利用」と同じか否かという解釈でのコメントでした。
guest

0

一つのメソッドfunc(T,U)ではだめなのですか?

投稿2018/11/10 13:25

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azarashi0002

2018/11/10 13:53

コードは簡略化しており、 元々はoperator*=のオーバーロードです。 なので引数を2つ取らないので それではだめです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問