C++基礎——tricks,讓人驚豔的那些程式碼
阿新 • • 發佈:2019-02-02
獲得可變引數列表中最大型別大小
可變引數,以遞迴的形式加以判斷是否為最大型別:
template<typename T, typename...TS>
struct variant_helper
{
static const size_t size =
sizeof(T) > variant_helper<TS...>::size ?
sizeof(T): variant_helper<TS...>::size;
}
// 模板特化,有點類似於遞迴推出的情形
template<typename T>
struct variant_helper<T>
{
static const size_t size =
sizeof(T);
}
variant_helper<char, short, int, long, float, double>::size
template<typename... TS>
struct variant
{
typedef variant_helper<TS> helper;
char raw_data[helper::size];
}
tagged union
具有標籤屬性的union:
struct t_union
{
enum {t_int, t_bool, t_float} type_id;
union
{
int as_int;
bool as_bool;
float as_float;
}
}
u_union u;
u.as_int = 10;
u.type_id = t_union::t_int;
模板的特化
template<class Type>
class Null;
template<>
class Null<int >
{
public:
Null() {}
operator int() const
{
return int(std::numeric_limits<int>::max());
}
}
template<>
class Null<size_t>
{
public:
Null() {}
operator size_t() const
{
return size_t(numeric_limits<size_t>::max());
}
}
template<>
class Null<double>
{
public:
Null(){}
operator double() const
{
return double(numeric_limits<double>::max());
}
}
客戶端程式碼:
class AttrValue
{
public:
typedef boost::variant<int, double> value_type;
// Null<>類例項用於一種初始化的動作
// 類的建構函式初始化引數列表可展開為:
// value_ = Null<size_t>(); // 會顯式地呼叫其型別轉換運算子函式過載
AttrValue():value_(Null<size_t>()) {}
private:
value_type value_;
}