[cfe-commits] PATCH: Add VariadicFunction class template to LLVM's ADT
Douglas Gregor
dgregor at apple.com
Thu Dec 15 10:19:12 PST 2011
On Dec 15, 2011, at 3:55 AM, Chandler Carruth wrote:
> Hello folks,
>
> This patch adds a generic collection of class templates to the LLVM ADT for building variadic-like functions in C++98. The idea, from the comments, is:
>
> /// Suppose we need a variadic function like this:
> ///
> /// ResultT Foo(const ArgT &A_0, const ArgT &A_1, ..., const ArgT &A_N);
> ///
> /// Instead of many overloads of Foo(), we only need to define a helper
> /// function that takes an array of arguments:
> ///
> /// ResultT FooImpl(const ArgT *const Args[], int Count) {
> /// // 'Count' is the number of values in the array; 'Args[i]' is a pointer
> /// // to the i-th argument passed to Foo(). Therefore, write '*Args[i]'
> /// // to access the i-th argument.
> /// ...
> /// }
> ///
> /// and then define Foo() like this:
> ///
> /// const VariadicFunction<ResultT, ArgT, FooImpl> Foo;
>
> We used this pattern extensively to build up the AST matcher library on top of Clang (and so I've included cfe-commits in case anyone there is interested). In preparation for mailing patches for those matchers, I'm sending a patch that just adds the generic utility to the ADT library as that seems like a natural home for it.
>
> Previous versions of this bit of helper code used a fully expanded source file that would be hard to maintain. I was worried about using the preprocessor to expand these constructs, but it turned out *much* easier than I had feared, and I think the result is much easier to read and maintain. That said, if anyone dislikes the preprocessor hammering, I'm happy to switch to a more manually expanded form.
I think the preprocessor use here is fine. It's ugly, but it's less ugly than the repetition is avoids.
Just one comment:
+ VariadicFunction() {}
+
This is not trivial, which is unfortunate. Please just leave out the default constructor so we'll get the implicitly-generated trivial default constructor. (The same goes for all of the VariadicFunction* class templates).
Also, I agree with David about the use of ArrayRef.
> I've also included Doug so that he can rant about adding hacks to LLVM/Clang to work around the absence of variadic templates. ;]
Someone can have fun adding a variadic-templates version for those of us who compile with C++11 support (so long as it's source compatible, naturally).
- Doug
More information about the cfe-commits
mailing list