模板編程如何引入類型是否存在條件???
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&
namespace Impl {
// 如果 Alloc::Pointer 不存在的話,就用 ValueType*
template &
struct PointerType { using Type = typename Alloc::ValueType*; };
// 如果 Alloc::Pointer 存在的話,就用 Alloc::Pointer
template &
struct PointerType&
}
template &
struct AllocatorTraits {
using Pointer = typename Impl::PointerType&
};
struct A { using ValueType = int; };
struct B { using ValueType = int; using Pointer = void*; };
int main() {
// A 中沒有定義 Pointer,所以得到 int*
static_assert(std::is_same&
// B 中定義了 Pointer,所以得到 void*
static_assert(std::is_same&
return 0;
}
(C++11,僅作示範)
差不多就是這個意思,用SFINAE解決掉類型不存在的情況就行了。
enable_if可以吧!
推薦閱讀:
※能否通過對編譯器或者編譯環境的限制來應對木馬或者病毒呢?
※如何構造上下文無關文法?
※現代C++編譯器是否會根據debug期間運行所得的信息來進行優化?
※有沒有介紹LLVM的書籍可以推薦?最好是中文的
※計算機是怎麼區分int類型和float類型的數據的?