多分まだ上げてなかったと思う。タイトルは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); }