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

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

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

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

Q&A

解決済

1回答

544閲覧

再帰的なテンプレートについて

seiyouakadanuki

総合スコア25

C++

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

0グッド

1クリップ

投稿2019/03/07 14:05

ボールドテキスト### 前提・実現したいこと
vector<string>型で定義された集合のvector<vector<string>>型の冪集合を作成する関数をテンプレート化して冪集合の冪集合なども作成できる関数power()という引数がT(テンプレート)、返り値がvector<T>な関数があるのですが、これを使ってある自然数nを渡したらn回この関数を起動して冪集合の冪集合の・・・ということを実現しようとしたのですが、型推論がうまくいかなかったためかコンパイルが終わらなくなりました。そこで人に尋ねたところ以下のようなソースコードを渡されました。曰く、読むには多大な知識を擁するそうなのですが、具体的に何を行なっているかを解説していただければ幸いです。もしくは参考になる資料を提示して頂けると勉強がしやすいのでお願いします。

該当のソースコード

//1
//呼び出し方Recurr<vactor<string>, 2>::incr_power(sa);
template<typename T, std::size_t N>
struct Recurr;

template<typename T>
struct Recurr<T, 0> {
static void incr_power(const T& x)
{
cout <<"done\n";
}
};

template<typename T, std::size_t N>
struct Recurr {
static void incr_power(const T& x)
{
cout << N <<endl;
cout << x <<endl;
Recurr<vector<T>, N-1>::incr_power(power(x));
cout << endl;
}
};

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

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

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

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

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

guest

回答1

0

ベストアンサー

どのあたりがわからないのかわからないのでふわっと全体を説明しようとしてみますが、ようは、こういうことですよね。

void Recurr_incr_power_0(string typeName, std::size_t N) { cout <<"done\n"; } void Recurr_incr_power(string typeName, std::size_t N) { cout << N <<endl; cout << typeName <<endl; if(N == 1) { // このif-elseは元コードでは勝手に振り分けられる Recurr_incr_power_0("vector<" + typeName + ">", N-1); } else { Recurr_incr_power("vector<" + typeName + ">", N-1); } cout << endl; }

上記はtemplateを使わないためにstringで型名を出していますが、本来はその型名の通りの型がtemplate引数として使用されます。
最初の呼び出しRecurr<vactor<string>, 2>::incr_power(sa);では、Recurr<vector<T>, N-1>::incr_power(power(x));のTはvector<string>なので、Recurr<vector<vector<string>>, N-1>::incr_power(power(x));になります。それをNが0になるまで繰り返してます。

とりあえず、コードはコードブロックで囲ってください。記入欄の上に<code>ってあるので。また、可能な限りコンパイルが通る状態が望ましいです。

投稿2019/03/08 01:01

moredeep

総合スコア1507

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

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

seiyouakadanuki

2019/03/08 15:22

丸投げのような質問に親切な回答をくださり感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問