
David Abrahams:
On conforming compilers, the library uses overloading to look up the value associated with any given keyword. I assumed that having two of the same keyword would cause an ambiguity error at lookup time:
7.3.3/12 of the standard appears to deal with this: "When a using-declaration brings names from a base class into a derived class scope, member functions in the derived class override and/or hide member functions with the same name and parameter types in a base-class (rather than conflicting)." i.e. a working model of the same keyword twice on an arg_list: struct keyword {}; struct base { int operator[](const keyword &) { return 1; } }; struct derived : public base { using base::operator[]; int operator[](const keyword &) { return 2; } }; int main() { return derived()[keyword()]; }
The problem with this (aside from the use of an ALL_CAPS name for something other than a macro)
Thanks for the tip!
is that it costs O(N^2) instantiations, where N is the number of arguments. OTOH you could do it with overloading (or just use an mpl::set, which uses overloading internally) to do it in O(N).
Oooh, that's much better. With used_keywords as an empty set in empty_arg_list, all it needs in arg_list is: BOOST_STATIC_ASSERT((!boost::mpl::has_key< typename Next::used_keywords, key_type>::type::value)); typedef typename mpl::insert<typename Next::used_keywords, key_type>::type used_keywords; Or is there already something that captures the above pattern, i.e. refuses to insert a duplicate? --Daniel.