Template typedefs - What's your work around?

The canonical way is to use a metafunction like thus: template struct my_string_map { typedef std::map type; }; // Invoke: my_string_map::type my_str_int_map This is also used in the STL ( allocator::rebind).

The canonical way is to use a metafunction like thus: template struct my_string_map { typedef std::map type; }; // Invoke: my_string_map::type my_str_int_map; This is also used in the STL (allocator::rebind) and in many libraries including Boost. We use it extensively in a bioinformatical library. It's bloated, but it's the best alternative 99% of the time.

Using macros here is not worth the many downsides. (EDIT: I've amended the code to reflect Boost/STL conventions as pointed out by Daniel in his comment. ).

1 If you use 'type' instead of 'Type' (or in addition to) this will work better with Boost.MPL. Which can be useful, so I think it's a good convention to encourage. – Daniel James Sep 16 '08 at 11:44 is this really called a metafunction?

I doubt it. – Matthieu N. Jan 24 at 1:58 @Zenikoder: It’s perfectly reasonable to call it a metafunction, and most C++ metaprogramming experts do so (e.g. The Boost people).

There doesn’t exist one rigorous definition but personally I call everything a metafunction that, at compile-time, yields a type or compile-time constant given some input. That is, any mapping from an input to an output at compile time. I don’t know that any more reasonable or more widely accepted definition exists.

Finally, can I ask why you object to this usage of the term? – Konrad Rudolph Jan 24 at 12:05.

GOTW dealt with this topic a while ago: gotw.ca/gotw/079.htm.

Template struct my_string_map : public std::map { }; You shouldn't inherit from classes that do not have a virtual destructor. It's related to destructors in derived classes not being called when they should be and you could end up with unallocated memory. That being said you could **probably** get away with it in the instance above because you're not adding any more data to your derived type.

Note that this is not an endorsement. I still advice you don't do it. The fact that you can do it doesn't mean you should.

EDIT: Yes, this is a reply to ShaChris23's post. I probably missed something because it showed up above his/her message instead of below.

– Evan Teran Jan 18 '10 at 23:06 These aren't forums, post do not appear in chronological order. Normally, this would be a comment. You cannot, so perhaps a community wiki answer would have done.

Either way, the question is quite old. – GMan Jan 18 '10 at 23:25 2 I noticed that it's quite old, but I thought it was a good thing to make sure it was not encouraging incorrect practices. Ttyl – xghost Jan 18 '10 at 23:36.

Inheritance is only then a problem if a pointer of the base class points to an object of the derived class, such as Base *p = new Derived(); However, the trick with the inheritance here is that we don't want to type too much. We either want Derived *p = new Derived(); or Derived d; In these cases the constructors are called in the right order. Here is a full code.

#include using namespace std; class Base { public: Base(){ cout Derived*\n"; Base *BasePtr = new Derived(); delete BasePtr; cout Derived*\n"; Derived *DerPtr = new Derived(); delete DerPtr; cout.

1 -1: the question is not about inheritance and your answer do not even have template nor typedef. Did you answer the wrong question? – n1ckp Sep 10 at 12:13.

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions


Thank You!
send