はかせのラボ

私の頭の中を書いていく雑記ブログです

C++ タスクシステム⑦ ~クラステンプレート型推論~

あいさつ

どうも、はかせです。
今回はクラステンプレートの引数リストの推論です。

クラステンプレート推論

私がずっとめんどくさいうまくする方法はないかと考えていたことです。
要は

Task<int> task(....);

ではなく、

//引数から型を推論したい
Task task(....);

こんな感じで書いて、

//Task管理配列
std::list<Task> taskList;

こんな配列を用意してタスクを管理したいわけです。


やり方

クラステンプレートのテンプレート引数推論を行うためには
使用するC++のバージョンをC++17以上にする必要があります。

バージョンは
プロジェクト→プロパティ→C/C++→言語→C++言語標準から設定できます。
C++17以上にすることでコンストラクタで渡した引数から
テンプレート引数を推論できるようになります。

template <class T>
class X
{
    X(T value){};
}
//今までのやり方
X<int>(10);
//推論で<int>がなくともX<int>として扱う
X(10);
//これは出来ないみたい
auto x = new X(10);

こうすることで今までめんどくさい困っていた
呼び出し側がテンプレート引数を明示的に書かなければならない義務から解放されます。

ただ結局推論してるだけでテンプレート引数が違う場合は別クラスのインスタンスとして扱われる
仕様は変わっていないようで1つの型で一元管理は出来ないようです。
(一番したいことがいまだできない・・・orz)

あとがき

今回はクラステンプレートのテンプレート引数の推論でした。
VisualStudio2017は設定しないとC++14の設定が適用されるようで
中々できなくて困っていました。
(最新を初期設定にしてくれればいいのに・・・)

とりあえずこれで呼び出しは楽になりました。
あとはこれを一元管理できるようにすれば、
私の理想に大分近づけると思います。

それでは今回はこの辺でノシ