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

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

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

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

Q&A

解決済

2回答

1522閲覧

なぜtypename = が必要なのでしょうか。

__ook

総合スコア49

C++

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

0グッド

0クリップ

投稿2020/03/11 09:24

以下のようなコードを見ました。

cpp

1template <typename T, typename = typename std::enable_if<std::is_same<T, int>::value>::type> 2void f(T) {}

typename = とはなんの処理なのでしょうか?

cpp

1template <typename T, typename std::enable_if<std::is_same<T, int>::value>::type>

上記で動くかと思いましたが動きませんでした。

正直この構文については本当に理解できておらず、なぜこれで特定できているのかわかりません…

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

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

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

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

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

guest

回答2

0

こんにちは。

その形式は、使ったことはないのですが、恐らく型引数名の省略だろうと思います。

C++

1template <typename T, typename hogehoge = typename std::enable_if<std::is_same<T, int>::value>::type> 2void f(T) {}

投稿2020/03/11 10:21

Chironian

総合スコア23272

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

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

__ook

2020/03/11 10:24

なるほど、たしかに省略のようですね…ありがとうございます。
guest

0

ベストアンサー

デフォルト引数ですね。
その全体の技法はSFINAEとして知られています。

template <typename T, typename std::enable_if<std::is_same<T, int>::value>::type>の場合、typename std::enable_if<std::is_same<T, int>::value>::typeってintとかと同じただの型名なのですが、enable_ifの第一引数にtrueが渡った時、void型になります。ところがvoid型の値は存在しませんから、どうやっても呼び出せません。template<int n>みたいなのを思い出して下さい

なお、SFINAEのやり方自体はお示しのものよりは

cpp

1template<typename T, std::enable_if_t<std::is_same_v<T, int>, std::nullptr_t> = nullptr>

を使うことが多いように思います。
std::enable_ifを使ってオーバーロードする時、enablerを使う?

投稿2020/03/11 10:08

編集2020/03/11 10:11
yumetodo

総合スコア5850

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

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

__ook

2020/03/11 10:23

回答ありがとうございます。 typename = typenameという形に戸惑ってしまいました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問