
From: Tobias Schwinger <tschwinger@neoscientists.org>
Here we go again. The next update. Big thanks go to Rob Stewart and David Abrahams for their helping with this text.
You're welcome. I'm glad to help.
There is a version of this passage with markup: http://tinyurl.com/bxvke
Can we freeze this part?
I don't think it is finished yet, but it is a vast improvement over the earlier versions.
Tag Types ----------
The Function Type library uses tag types to represent one more properties of a type, such as its variadicness or whether the function is decorated with a pointer.
function type, such as whether it is variadic or is a pointer to a function. I dislike "variadicness." It just struck me that a type is never decorated with a pointer, though it can be a pointer to another type. Hence, "is a pointer to a function" rather than "decorated with a pointer."
Tags that represent the values of a single property are called property tags. These tags can be used to determine whether one property of a type or another tag has a particular value.
is_function< T, variadic > is_function< T, pointer >
A compound property tag describes a combination of possible values of different properties. The tag class template can be used to create a specific compound property tag.
tag<pointer,variadic> // describes a pointer to a variadic function
When several tags for the same property appear in the argument list, only the last
I think this may have bounced around already, but "the argument list" sounds too vague to me. It should be "tag's argument list."
one is used; others are ignored.
s/others/all others/
tag<pointer,reference> // same as 'reference'
s/'reference'/tag<reference>/
The following code creates the type int(*)(int...).
function_type<mpl::vector<int,int>, tag<pointer,variadic> >::type
All properties not described by the tag acquire a default. The next example
All properties have a default tag. If you don't specify a tag for a property, that property's default tag is used instead. The following expression
creates the type of an undecorated (variadic) function of the default calling
s/ (variadic)/, variadic/ s/of the default/with the default/
convention: int(int...).
function_type<mpl::vector<int,int>, variadic >::type
Do the defaults only apply to synthesis? You only show/describe their use in that context. I haven't looked at the text with markup, but the following text seems disjoint from the foregoing:
A compound property tag matches a type only when all of its component properties match:
is_function< void(&)(...) , tag<reference,variadic> >::value // is true is_function< void(X::*)(...), tag<reference,variadic> >::value // is false
Since this example uses is_function as the earlier examples did, perhaps you could move this part ahead of "The following code creates the type int(*)(int...)" part. -- Rob Stewart stewart@sig.com Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;