On the richness of C++

Bill Baxter dnewsgroup at billbaxter.com
Sun Apr 13 20:11:16 PDT 2008


Edward Diener wrote:
> Georg Wrede wrote:
>> Edward Diener wrote:
>>> Walter Bright wrote:
>>>
>>>> Edward Diener wrote:
>>>>
>>>>> Walter Bright wrote:
>>>>>
>>>>>> Kevin Bealer wrote:
>>>>>>
>>>>>>> I was amazed that Boost could do things like the Lambda support 
>>>>>>> with _1 _2, etc.
>>>>>>> Those Boost guys are geniuses.
>>>>>>
>>>>>>
>>>>>> I agree, they are geniuses. But that's really what is wrong with 
>>>>>> C++, you shouldn't have to be a genius to get advanced things done.
>>>>>
>>>>>
>>>>> Are D's templates a complete replacement in functionality for 
>>>>> Boost's MPL ? If so could you write an article on your web site 
>>>>> about the how's and why's of that ? I am still trying to understand 
>>>>> D's templates based on the sparse documentation of them.
>>>>
>>>>
>>>> I don't really understand Boost MPL, but D's template system is 
>>>> considerably more powerful than C++'s.
>>>
>>>
>>> I do not know the MPL either although I understand the general 
>>> concept. It is a C++ template metaprogramming library for 
>>> manipulating types at compile time so that the final result of the 
>>> body of a template deals in whatever types the template 
>>> metaprogramming needs to generalize for his programming task.
>>>
>>> I agree that what I currently understand of D templates looks clearer 
>>> than the template system in C++ but I am not knowledgable enough to 
>>> know whether it is "better", or easier to use in doing the sorts of 
>>> things which Boost programmers accomplish.
>>>
>>>> I agree that more documentation is needed, but one can easily write 
>>>> a book about it.
>>>
>>>
>>> The question is: has anyone tackled in D some of the template 
>>> metaprogramming tasks which various Boost programmers have 
>>> accomplished with C++ ?
>>>
>>> I am trying to get a feel for how different, or how much easier ( or 
>>> perhaps harder ) it would be to do Boost things like Spirit ( 
>>> lex/yacc-like DSEL ), function ( universal callable ), bind and/or 
>>> lambda ( function object creation ), shared_ptr ( sharable smart 
>>> pointer, obviously for RAII in D because of GC ), signals ( 
>>> generalized multicast events ), multi_index ( multiple index 
>>> containers ), regex and/or xpressive ( regular expressions ), 
>>> tokenizer ( generalized tokening of strings ), date_time ( date/time 
>>> and time intervals ) and many others ( the above are just my 
>>> favorites but I have hardly explored/used all of them ) which C++ 
>>> programmers find very useful. All of these libraries depend on 
>>> template metaprogramming in C++. Can their equivalents just as easily 
>>> be implemented and have any of them been done already ?
>>
>> Now the above is approaching the idea of this thread.
> 
> In Boost there is an entire metaprogramming paradigm based on a set of 
> conventions regarding C++ templates and types, as implemented by the 
> Boost MPL. This is despite the fact that C++ template syntax is much 
> more abstruse than D's templates. So I was merely wondering if there is 
> anything equivalent in D which can manipulate templates the way that the 
> Boost MPL can. I agree that D's templates appear much easier to use but 
> whether or not they are richer in functionality than C++ templates is 
> something I do not know, but would love to find out about. But that 
> would mean a comparison between what D can do with its templates as 
> opposed to what the Boost MPL can do.
> 
>>
>>> I have not looked at the D libraries, phobos and tango I believe they 
>>> are called, so maybe I am way off base comparing the Boost libraries 
>>> to what may already be in D. But I am trying to get an idea if D is 
>>> capable of doing these Boost things just as easily or easier.
>>
>> Yes! And I think those are things that very may, who don't regularly 
>> write in this NG, really wonder about with D.
> 
> The template syntax is clearer, but I don't know if it is better, and/or 
> why. I am a big advocate of clarity in computer languages but not if 
> there is any loss of functionality. I do not believe that clarity should 
> ever be sacrificed for needed functionality. That is one reason I still 
> believe that Java and C# are merely subsets of C++, not improvements. 
> Taking away functionality for clarity is never the way to go, but adding 
> clarity while keeping, or improving the same functionality, as D has 
> done in mostr cases, is admirable. However in some areas D seems to have 
> given away functionality for clarity, or some holy grail which few 
> understand, as in the const debacle.
> 
> I am hoping Walter will address this issue of template functionality as 
> opposed to syntax, between C++ and D, extensively sometime in the 
> future, hopefully in a technically neutral way ( he tends to be biased 
> toward D fro some odd reason <g> ).

It would be interesting to see what it takes to reproduce MPL in D.

But here's a quickie for you, to implement a "type sequence" like 
mentioned here 
[http://www.boost.org/doc/libs/1_35_0/libs/mpl/doc/tutorial/representing-dimensions.html] 
the code looks basically like this:

template boost_mpl_vector(T...) {
    alias T boost_mpl_vector;
}

Then you can do like the first example on that page:

     alias boost_mpl_vector!(char, short, int, long) signed_types;

The next one, the int_<N> template is probably just this in D:

template int_(int N) {
    const value = N;
}

Or maybe it would be

struct int_(int N) {
    static const value = N;
}

Then the "vector_c" integral sequence wrapper starts to get interesting, 
but is probably something like this:

template vector_c(T, Vals...)
{
    alias ConstList!(int, Vals) vector_c;
}

... plus one recursively defined template ConstList, which would 
probably be about 5-10 lines of code.  Sorry, don't have time to work it 
through right now, but maybe someone else can pick up from there. :-)

--bb



More information about the Digitalmars-d mailing list