Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Reference(參考)

AUTO, AUTO_TPL
COMPLIANT
INCREMENT_REGISTRATION_GROUP
INTEGRAL
LIMIT_FUNCTION_ARITY
LIMIT_SIZE
REGISTER_TYPE
REGISTER_TEMPLATE
TEMPLATE
TYPEOF, TYPEOF_TPL
TYPEOF_NESTED_TYPEDEF, TYPEOF_NESTED_TYPEDEF_TPL

AUTO, AUTO_TPL

BOOST_AUTO 宏模仿 C++ 中被提議的 auto 關鍵字。

用法

BOOST_AUTO(var,expr)
BOOST_AUTO_TPL(var,expr)

參數

var
一個被表達式初始化的變量
expr
一個合法的 C++ 表達式

備註

如果你要在模板上下文中使用 auto,請使用 BOOST_AUTO_TPL(expr),它可以處理 auto 表達式中的 typename 關鍵字。

示例代碼

int main() 
{
    length::meter a(5);
    force::newton b(6);
    BOOST_AUTO(c, a * b);
}

COMPLIANT

BOOST_TYPEOF_COMPLIANT 宏可以用於強加仿真方式。如果你的編譯器在缺省情況下使用其它方式(諸如原生 typeof 或微軟特有的訣竅),但是你有需要使用仿真方式,比如為了可移植性的原因,你就可以定義它。

INCREMENT_REGISTRATION_GROUP

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)

INTEGRAL

BOOST_TYPEOF_INTEGRAL 宏用於使用 BOOST_TYPEOF_REGISTER_TEMPLATE 註冊整模板參數的時候。

對於enums 和附屬的整模板參數是很有用的。

用法

BOOST_TYPEOF_INTEGRAL(x)

參數

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))
    )

LIMIT_FUNCTION_ARITY

BOOST_TYPEOF_LIMIT_FUNCTION_ARITY 宏定義了可以支持的函數參數的個數,適用於函數,函數指針,函數引用,以及成員函數指針。缺省值為 10,如果你想要 Typeof 庫處理更多參數的函數,就要重新定義。

LIMIT_SIZE

BOOST_TYPEOF_LIMIT_SIZE 宏定義了用於編碼一個類型的編譯期序列的大小。缺省值為 50。如果你想要 Typeof 庫處理更複雜的類型,可以增加這個數值,但是這可能是你的編譯器支持的模板參數的最大數量。另一方面,如果你只是使用很簡單的類型,減少這個數值可以幫助你提升 boost 的編譯期性能。

REGISTER_TYPE

BOOST_TYPEOF_REGISTER_TYPE 宏將一個類型的存在通知 Typeof 庫。

用法

BOOST_TYPEOF_REGISTER_TYPE(x)

參數

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)

REGISTER_TEMPLATE

BOOST_TYPEOF_REGISTER_TEMPLATE 宏將一個模板的存在通知 Typeof 庫,並描述它的參數。

用法

BOOST_TYPEOF_REGISTER_TEMPLATE(x, n)
BOOST_TYPEOF_REGISTER_TEMPLATE(x, seq)

參數

x
一個全修飾的模板
n
模板參數的數量。只有所有的模板參數都是 typenames 時,才是合法的
seq
一個模板參數的序列。在提供整類型或 template template parameters(模板模板參數)時必須使用

備註

必須用於全局名字空間。

庫允許帶有類型,整類型,以及模板模板參數的模板註冊:

  • 一個 type template parameter(類型模板參數)是用 (class)(typename) 描述的序列中元素
  • 一個顯而易見的整類型模板參數可以通過簡單地提供它的類型來描述,比如 (unsignedint)。以下是被支持的顯而易見的整類型:
    • [signed/unsigned]char
    • [unsigned]short
    • [unsigned]int
    • [unsigned]long
    • unsigned
    • bool
    • size_t
  • 整類型的枚舉和 typedefs 需要用 BOOST_TYPEOF_INTEGRAL 宏顯式描述,比如 (BOOST_TYPEOF_INTEGRAL(MyEnum))
  • template template parameters(模板模板參數)使用 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 template parameters(模板模板參數)時使用了 BOOST_TYPEOF_REGISTER_TEMPLATE,就需要使用 BOOST_TYPEOF_TEMPLATE 宏。

用法

BOOST_TYPEOF_TEMPLATE(n)
BOOST_TYPEOF_TEMPLATE(seq)

參數

n
模板參數的數量。只有所有的模板參數都是 typenames 時,才是合法的
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))) 
    )

TYPEOF, TYPEOF_TPL

BOOST_TYPEOF 宏推測一個表達式的類型,但是移除頂層修飾符,const&

用法

BOOST_TYPEOF(expr)
BOOST_TYPEOF_TPL(expr)

參數

expr
一個可以綁定到 const T& 的合法的 C++ 表達式

備註

如果你想要則模板上下文中使用 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_NESTED_TYPEDEF_TPL

TYPEOF_NESTED_TYPEDEF 宏的工作方法和 'TYPEOF' 宏大體相同,但是彌補了幾個編譯器的缺陷。

用法

BOOST_TYPEOF_NESTED_TYPEDEF(name,expr)
BOOST_TYPEOF_NESTED_TYPEDEF_TPL(name,expr)

參數

name
一個嵌套在 typeof 操作中內部的合法標識符
expr
一個可以綁定到 const T& 的合法的 C++ 表達式

備註

'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

PrevUpHomeNext