C++11 模板元編程 - 元函數(shù)轉(zhuǎn)發(fā)


前面介紹了元函數(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);
}

TypeList

返回 C++11模板元編程 - 目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容