スポンサーリンク

| キーワード:

C++ templateで条件を複数並べるif/elifみたいなものを作る

多分まだ上げてなかったと思う。タイトルはif-elifとしてあるけれど個人的な好みでSwitch / Caseにしてある。

以下のように、Switch< /* …. */ >::type とし、typeを決定する。

そのtypeは、Case<条件 , 型 > とし、条件がtrueの時の型とする。

条件は再起で上から順番に評価していて、trueが見つかった時点で探索をやめるので、複数あると先に書いた方が採用される。

#include "pch.h"
#include <iostream>

///////////////////////////////////////////////////////
// Switch / Case


template
<bool BOOL, typename Second> struct Case { static constexpr bool TBOOL = BOOL; using TSecond = Second; }; template<class Head, class... Tail> struct Switch { using type = typename std::conditional< Head::TBOOL, typename Head::TSecond, // trueの時 typename Switch<Tail...>::type //falseの時 >::type; }; //再起終端用特殊化 template<class Head> struct Switch<Head> { using type = typename std::conditional< Head::TBOOL, typename Head::TSecond, // trueの時 void >::type; };
///////////////////////////////////////////////////////
// 動作テスト用クラス

struct forInt {void disp() {std::cout << "int" << std::endl;}};
struct forFloat {void disp() {std::cout << "float" << std::endl;}};
struct forChar {void disp() {std::cout << "char" << std::endl;}};
//動作テスト用関数
template<typename T>
void disp_type(T val) {

  // 型 T によってDispTypeが変わる
  using DispType =
    typename Switch<
    Case<std::is_same<int, T>::value, forInt>,
    Case<std::is_same<float, T>::value, forFloat>,
    Case<std::is_same<char, T>::value, forChar>
    >::type;

  DispType tmp;

  tmp.disp();
}
int main()
{
  char value = 10;

  disp_type(value);

}

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: