模板編程如何引入類型是否存在條件???

std::allocator_traits - cppreference.com

pointer Alloc::pointer if present, otherwise value_type*

在這個member types中,你先要判斷模板類Alloc裡面有沒有pointer成員,然後再決定這個member types的類型

我查了stdlibc++的bits/alloc_traits.h實現

_GLIBCXX_ALLOC_TR_NESTED_TYPE(pointer, value_type*)

typedef __pointer pointer;

調用的宏是

#define _GLIBCXX_ALLOC_TR_NESTED_TYPE(_NTYPE, _ALT)

private:

template&

static typename _Tp::_NTYPE _S_##_NTYPE##_helper(_Tp*);

static _ALT _S_##_NTYPE##_helper(...);

typedef decltype(_S_##_NTYPE##_helper((_Alloc*)0)) __##_NTYPE;

public:

這段代碼有一點看不懂就是

_S_##_NTYPE##_helper(_Tp*)這個宏找不到定義啊,它應該不是個函數,但是我找不到這個的定義


std::experimental::is_detected, std::experimental::detected_t, std::experimental::detected_or

libstdc++ 在 2015 年就改成用 detection idiom 了([gcc] Revision 225244)。早已經不存在你說的宏了


#include &

// 某C++17的 std::void_t
template &
struct VoidTypeImpl { using Type = void; };
template &
using VoidType = typename VoidTypeImpl&::Type;

namespace Impl {

// 如果 Alloc::Pointer 不存在的話,就用 ValueType*
template &
struct PointerType { using Type = typename Alloc::ValueType*; };
// 如果 Alloc::Pointer 存在的話,就用 Alloc::Pointer
template &
struct PointerType&&> { using Type = typename Alloc::Pointer; };

}

template &
struct AllocatorTraits {

using Pointer = typename Impl::PointerType&::Type;

};

struct A { using ValueType = int; };
struct B { using ValueType = int; using Pointer = void*; };

int main() {

// A 中沒有定義 Pointer,所以得到 int*
static_assert(std::is_same&::Pointer, int*&>::value, "???");
// B 中定義了 Pointer,所以得到 void*
static_assert(std::is_same&::Pointer, void*&>::value, "???");
return 0;

}

(C++11,僅作示範)

差不多就是這個意思,用SFINAE解決掉類型不存在的情況就行了。


enable_if可以吧!


推薦閱讀:

能否通過對編譯器或者編譯環境的限制來應對木馬或者病毒呢?
如何構造上下文無關文法?
現代C++編譯器是否會根據debug期間運行所得的信息來進行優化?
有沒有介紹LLVM的書籍可以推薦?最好是中文的
計算機是怎麼區分int類型和float類型的數據的?

TAG:模板 | STL | C | CC | 編譯器 |