普段はJavaを書いているのですが、ちょっとした用事でC++を読むことになり
その途中でテンプレートテンプレート仮引数が読めなくて躓いたので自分用のメモを作成します。
下のようなコードがあった時クラスAがテンプレートテンプレート仮引数を持つ。
template<template<class U> class T>
class A{
public:
A(){
}
};
このクラスが表現したい事は単純で、ただ単にAを生成する時のTは
テンプレート引数を1つ持つクラスしか渡せませんということらしい。
(これに辿り着くまで、かなり悩んだ)
なので使い方としては以下のようになる。
#include <string>
template<template<class U> class T>
class A{
public:
A(){
}
};
template<class T>
class B{
public:
B(){
}
};
int main(){
A<B> a0; //この行はコンパイル出来る
//A<std::string> a1; //この行はコンパイル出来ない
}
この時、クラスAにたいしてstd::vector
をパラメタとして渡せなくて躓いた。
もしstd::vector
を渡せるクラスAを書きたい場合下記のように書く必要がある。
template<template<class U,class V> class T>
class A{
public:
A(){
}
};
追記
コメント頂いて知ったのですが、g++だと-std=c++17
をつけると
冒頭のAクラスのままでもstd::vector
を実パラメタとして渡せるようです。