前面介紹了元函數(shù)轉(zhuǎn)發(fā)的概念,也就是通過已有的元函數(shù)組合,來定義新的元函數(shù)。
如下我們實現(xiàn)一個元函數(shù)TypeSize用于求一個類型的size值:
template<typename T>
using TypeSize = __int(sizeof(T));
得益于__int()
是個元函數(shù),我們通過調(diào)用它實現(xiàn)了TypeSize。由于上述通過調(diào)用或者組合元函數(shù)來定義新的元函數(shù)的模式非常常用,為了簡化一些臨時場合下的定義方式,避免每次都要為形參起名字,所以TLP庫中專門定義了一組宏,用來簡化元函數(shù)轉(zhuǎn)發(fā)的定義方式。
// "tlp/func/Forward.h"
#define __func_forward(Name, ...) \
using Name = __VA_ARGS__
#define __func_forward_1(Name, ...) \
template<typename _1> using Name = __VA_ARGS__
#define __func_forward_2(Name, ...) \
template<typename _1, typename _2> using Name = __VA_ARGS__
#define __func_forward_3(Name, ...) \
template<typename _1, typename _2, typename _3> using Name = __VA_ARGS__
#define __func_forward_4(Name, ...) \
template<typename _1, typename _2, typename _3, typename _4> using Name = __VA_ARGS__
這組宏專門用來實現(xiàn)元函數(shù)轉(zhuǎn)發(fā),它默認為形參起好了從_1
開始的名稱。有了這組宏,TypeSize可以如下方式定義:
__func_forward_1(TypeSize, __int(sizeof(_1)));
我們前面實現(xiàn)過判斷一個類型是否是另一個類型的父類的元函數(shù)__is_base_of()
,我們用它實現(xiàn)一個新的元函數(shù),用來在兩個類型中選擇出父類類型返回。
__func_forward_2(SupperOf, IfThenElse<__is_base_of(_1, _2), _1, _2>);
可以測試一下:
TEST("should_choose_the_base_type")
{
struct Base{};
struct Derived : Base{};
ASSERT_EQ(typename SupperOf<Derived, Base>::Result, Base);
}