c++ - Default template argument when using std::enable_if as templ. param.: why OK with two template functions that differ only in the enable_if parameter? -
in language reference of std::enable_if @ cppreference following note included
notes
a common mistake declare 2 function templates that differ in default template arguments. illegal because default template arguments not part of function template's signature, , declaring 2 different function templates same signature illegal.
in template functions in example below, seems me situation occurs. i.e., 2 template functions onlyforderivedobjects(...) seem (to me) differ default template arguments. realize missing here, , can explain me, or point me in direction might find epiphany myself.
- question: w.r.t. quote above, why example below compile , run fine: misclassify
typename std::enable_if ...part in template functions below when consider yield situation 2 template functions differ in default template argument?
example
base , derived classes:
class basea { public: int getint() const { return 21; }; }; class deriveda : public basea {}; class baseb { public: int getanotherint() const { return 33; }; }; class derivedb : public baseb {}; with following template functions
/* template functions that, seemingly, differ in default template arguments? */ template< class t, typename std::enable_if<std::is_base_of<basea, t>::value>::type* = nullptr > int onlyforderivedobjects(const t& obj) { return 2*obj.getint(); } template< class t, typename std::enable_if<std::is_base_of<baseb, t>::value>::type* = nullptr > int onlyforderivedobjects(const t& obj) { return 3*obj.getanotherint(); } compiles , runs fine (g++ -wall -std=c++11 ..., g++ 4.9.3)
#include <iostream> #include <type_traits> /* ... classes , template functions above */ /* template argument deduction seems work fine */ int main() { deriveda* obja = new deriveda(); derivedb* objb = new derivedb(); std::cout << onlyforderivedobjects(*obja) << std::endl; // 42 std::cout << onlyforderivedobjects(*objb) << std::endl; // 99 return 0; }
notes
a common mistake declare 2 function templates differ in default template arguments. illegal because default template arguments not part of function template's signature, , declaring 2 different function templates same signature illegal.
your functions don't differ in default template arguments, differ in template parameters, have different signatures.
in both cases default template argument nullptr, second template parameter different in each case.
Comments
Post a Comment