PromotionTraits is a technique which enables the return type of a function to be determined by the function arguments. This is described in CppTemplatesTheCompleteGuide, where working code is given. -- JohnFletcher

**Example of function definition**

A word of warning. Use of this can have side effects. I have had a problem where code to do with standard vectors would not work correctly and this turned out to be due to picking up an incorrect operator+. If**V** is a vector then **V[n]** is implemented for GnuCpp using ***(V.begin()+n)** which involves addition to the iterator. -- JohnFletcher
Does it touch such issues as subclasses of a common super-class (and finding most-derived common superclass)? That gets to be pretty damn difficult, though doable if you design specializations that indicate all superclasses of a class.

Related to OperatorOverloading

**April 2012** Now that CeePlusPlusEleven is available I am planning to phase out use of this as soon as possible in favour of **auto** and **decltype** which can do a better job as there is no need to set up macros for the cases needed. The only case I cannot solve so far is one involving VariadicTemplates. -- JohnFletcher

(For those interested, an example of the above using C++11:)

CategoryCppTemplates CategoryCpp

template <typename T1, typename T2> typename Promotion<T1, T2>::ResultT operator+ ( T1 const &, T2 const &);

A word of warning. Use of this can have side effects. I have had a problem where code to do with standard vectors would not work correctly and this turned out to be due to picking up an incorrect operator+. If

Related to OperatorOverloading

(For those interested, an example of the above using C++11:)

template <class T1, class T2> auto operator+(const T1& l, const T2& r) -> decltype(l + r);

CategoryCppTemplates CategoryCpp

EditText of this page (last edited October 16, 2012) or FindPage with title or text search