( ) , GIT gist , ( , ) "" (), ( "" ++ 03):
:
template<typename FalseType, typename TrueType, bool condition>
struct ConditionalTypeSelector {
typedef void ResultType;
};
:
template<typename FalseType, typename TrueType>
struct ConditionalTypeSelector<FalseType,TrueType,false> {
typedef FalseType ResultType;
};
template<typename FalseType, typename TrueType>
struct ConditionalTypeSelector<FalseType,TrueType,true> {
typedef TrueType ResultType;
};
:
struct A {
unsigned char member;
};
struct B {
int member;
};
struct C {
long long member;
};
:
#include <iostream>
#include <typeinfo>
using namespace std;
int main() {
cout << typeid
( ConditionalTypeSelector
< A,B,(sizeof(A) > sizeof(B))>::ResultType
).name() << endl;
cout << typeid
( ConditionalTypeSelector
<A,B,(sizeof(B) > sizeof(A)) >::ResultType
).name() << endl;
cout << typeid
( ConditionalTypeSelector
< A,C,(sizeof(A) > sizeof(C))>::ResultType
).name() << endl;
cout << typeid
( ConditionalTypeSelector
< C,B,true>::ResultType
).name() << endl;
cout << typeid
( ConditionalTypeSelector
< C,A,false>::ResultType
).name() << endl;
return 0;
}
template , . enum , , .
source
share