But tool design and language design are related matters.
You cannot simply take the tool design techniques for
C# and apply them to C++.
Toll /design/ yes, but there is a core of tool /functionality/ that is
common to most languages. There's quite a large overlap between the
functionality sets programmers want/need for C# can C++ because the one is
nearly a subset of the other.
The scope of the problem may be much greater in C++ because the language is
richer and more powerful. To pick a very simple example: a refactoring
manipulation to remove a block of code from a class method and make a
separate function of it. In C++ or C# you can simply cut/paste the lines of
code and create a new member function (which may accept as parameters some
of the quantities used in the code block). In C++, though, it might be more
appropriate to make a non-member non-friend function to do the job (and
maybe place it in an unnamed namespace in the compilation unit to avoid
flooding the global namespace) ... of if a similar refactoring is to be
done in several classes it might be more useful to make a function
template.
Yes, tools could do so much more in C++, but there's a useful subset of the
functionality that is just the same as what is done in C# (or Java).
How you write those tools may be very different, how you use them may not
be.
I think the notion that tools and language design should
be co-designed was introduced with Ada. The idea
was, tools should be specified along with the language
and both he designed to enforce or assist in creating a
standard coding style.
It's an interesting idea, but until the language has been used for a while
and people have solved real-world (and not-so real-world) problems in it
there will not be a sufficiently complete understanding of the language
idioms that work and are useful for a good toolset to be specified. How
long was it before idioms like RAII or pimpl (compilation firewall) were
recognized as standard techniques in C++? Or TMP?
Consider a generic class in C#: as you type it, you
constrain the parameter types with where-clauses.
So, when you get to the code, intellisense knows
what methods are available on these types though
they aren't bound.
It's hard to see how intellisense could accomplish
this in a C++ template. How can it help you select
a method name if the object could belong to just
about any class?
You can't, obviously. C++ isn't /quite/ a superset of C#.
Intellisense isn't really the sort of tool I was thinking of, though, C++
does have intellisense (though, as you point out, it has its limitations).
Cheers
Daniel.