![]() |
Home | Libraries | People | FAQ | More |
BOOST_AUTO 宏模仿 C++ 中被提議的 auto 關鍵字。
BOOST_AUTO(var,expr) BOOST_AUTO_TPL(var,expr)
參數
如果你要在模板上下文中使用 auto,請使用 BOOST_AUTO_TPL(expr),它可以處理 auto 表達式中的 typename 關鍵字。
int main() { length::meter a(5); force::newton b(6); BOOST_AUTO(c, a * b); }
BOOST_TYPEOF_COMPLIANT 宏可以用於強加仿真方式。如果你的編譯器在缺省情況下使用其它方式(諸如原生 typeof 或微軟特有的訣竅),但是你有需要使用仿真方式,比如為了可移植性的原因,你就可以定義它。
BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP 宏確保在不同的頭文件中的類型註冊接受唯一的標識符。
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
在每一個執行註冊的 cpp/hpp 文件中,在任何註冊之前,指定一次。
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() class X; BOOST_TYPEOF_REGISTER_TYPE(X)
BOOST_TYPEOF_INTEGRAL 宏用於使用 BOOST_TYPEOF_REGISTER_TEMPLATE 註冊整模板參數的時候。
對於enums 和附屬的整模板參數是很有用的。
BOOST_TYPEOF_INTEGRAL(x)
參數
對於內建類型(int, bool, long, unsigned long, 等)實現了一個簡短的語法,不支持其它非類型模板參數(譬如指向成員的指針)。
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() namespace foo { enum color {red, green, blue}; template<color C0,typename T1> class class_with_enum {}; template<typename T0,T0 I1> class class_with_dependent_non_type {}; } BOOST_TYPEOF_REGISTER_TEMPLATE(foo::class_with_enum, (BOOST_TYPEOF_INTEGRAL(foo::color)) (typename) ) BOOST_TYPEOF_REGISTER_TEMPLATE(foo::class_with_dependent_non_type, (typename) (BOOST_TYPEOF_INTEGRAL(P0)) )
BOOST_TYPEOF_LIMIT_FUNCTION_ARITY 宏定義了可以支持的函數參數的個數,適用於函數,函數指針,函數引用,以及成員函數指針。缺省值為 10,如果你想要 Typeof 庫處理更多參數的函數,就要重新定義。
BOOST_TYPEOF_LIMIT_SIZE 宏定義了用於編碼一個類型的編譯期序列的大小。缺省值為 50。如果你想要 Typeof 庫處理更複雜的類型,可以增加這個數值,但是這可能是你的編譯器支持的模板參數的最大數量。另一方面,如果你只是使用很簡單的類型,減少這個數值可以幫助你提升 boost 的編譯期性能。
BOOST_TYPEOF_REGISTER_TYPE 宏將一個類型的存在通知 Typeof 庫。
BOOST_TYPEOF_REGISTER_TYPE(x)
參數
必須用於全局名字空間
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() namespace foo { class bar {}; enum color {red, green, blue}; } BOOST_TYPEOF_REGISTER_TYPE(foo::bar) BOOST_TYPEOF_REGISTER_TYPE(foo::color)
BOOST_TYPEOF_REGISTER_TEMPLATE 宏將一個模板的存在通知 Typeof 庫,並描述它的參數。
BOOST_TYPEOF_REGISTER_TEMPLATE(x, n) BOOST_TYPEOF_REGISTER_TEMPLATE(x, seq)
參數
必須用於全局名字空間。
庫允許帶有類型,整類型,以及模板模板參數的模板註冊:
(class) 或 (typename) 描述的序列中元素(unsignedint)。以下是被支持的顯而易見的整類型:
[signed/unsigned]char[unsigned]short[unsigned]int[unsigned]longunsignedboolsize_tBOOST_TYPEOF_INTEGRAL 宏顯式描述,比如 (BOOST_TYPEOF_INTEGRAL(MyEnum))BOOST_TYPEOF_TEMPLATE 宏描述,比如:(BOOST_TYPEOF_TEMPLATE((class)(unsignedint)))。在全部為類型參數的情況下,這可以簡化為形如 (BOOST_TYPEOF_TEMPLATE(2)) 的樣子。不支持嵌套的模板模板參數。#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() namespace foo { template<typename T0, typename T1> class simple_template {}; template<typename T0, int I1> class class_with_integral_constant {}; } BOOST_TYPEOF_REGISTER_TEMPLATE(foo::simple_template, 2) BOOST_TYPEOF_REGISTER_TEMPLATE(foo::class_with_integral_constant, (typename)(int))
當註冊 template template parameters(模板模板參數)時使用了 BOOST_TYPEOF_REGISTER_TEMPLATE,就需要使用 BOOST_TYPEOF_TEMPLATE 宏。
BOOST_TYPEOF_TEMPLATE(n) BOOST_TYPEOF_TEMPLATE(seq)
參數
不能用於註冊嵌套 template template parameters(模板模板參數)。
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() namespace foo { enum color {red, green, blue}; template<color C0, template<typename> class T1> class nested_template_class {}; template<template<typename, unsigned char> class T1> class nested_with_integral {}; } BOOST_TYPEOF_REGISTER_TEMPLATE(foo::nested_template_class, (foo::color) (BOOST_TYPEOF_TEMPLATE(1)) ) BOOST_TYPEOF_REGISTER_TEMPLATE(foo::nested_with_integral, (BOOST_TYPEOF_TEMPLATE((typename)(unsigned char))) )
BOOST_TYPEOF 宏推測一個表達式的類型,但是移除頂層修飾符,const&
BOOST_TYPEOF(expr) BOOST_TYPEOF_TPL(expr)
參數
如果你想要則模板上下文中使用 typeof,請使用 BOOST_TYPEOF_TPL(expr),它可以處理 typeof 表達式中的 typename。
template<typename A, typename B> struct result_of_conditional { typedef BOOST_TYPEOF_TPL(true?A():B()) type; }; template<typename A, typename B> result_of_conditional<A, B>::type min(const A& a,const B& b) { return a < b ? a : b; }
TYPEOF_NESTED_TYPEDEF 宏的工作方法和 'TYPEOF' 宏大體相同,但是彌補了幾個編譯器的缺陷。
BOOST_TYPEOF_NESTED_TYPEDEF(name,expr) BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr)
參數
'typeof_nested_typedef' 將 'typeof' 操作嵌套在一個結構內。通過這樣做,'typeof' 操作可以分為兩步,這種方法可以避免編譯器誤解(特別是 VC7.1 和 VC8.0)。這樣也可以移除由 BOOST_TYPEOF_LIMIT_SIZE 強加的限制,並允許你在更大的表達式中使用 'typeof'。
如果你要在模板上下文中使用 typeof_nested_typedef,請使用 BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr),它可以處理 typeof 表達式中的 typename。
'typeof_nested_typedef' 不能在函數/塊範圍內使用。
template<typename A, typename B> struct result_of_conditional { BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested,true?A():B()) typedef typename nested::type type; }; template<typename A, typename B> result_of_conditional<A, B>::type min(const A& a,const B& b) { return a < b ? a : b; }
| Copyright 2004, 2005 Arkadiy Vertleyb, Peder Holt |