c++ - initializer list and conversion to everything, construction order -


situation like:

#include <utility> #include <typeinfo> #include <iostream>  struct c1 {     char const* str;      template <typename t> operator t() const { std::cout << "convert " << typeid(t).name() << "\n"; return {}; } };  struct c2 {     c2(c1 const&) { std::cout << "c2(c1)\n"; }     c2(std::initializer_list<std::pair<char const*, int>>) { std::cout << "c2(list)\n"; } };  int main() {     c1 c1{};     c2 c2{c1}; } 

output indicates c2(list) being called.

i c2(c1) called c1 argument, need parameters of std::initializer list remain deducible , convertible, , can not replace variadic-templated version. want control construction order, here //2 not template. suppose type std::pair can deserialized in normal conditions. c++14 may used

the following selects c2(c1) style both style, {...} , ({...}) (in strict c++11 standards, ({...}) style, select second, because c1 aggregate , special rules applied it. no longer case more recent standards.). works making second constructor no longer initializer constructor.

template<typename t> struct id { typedef t type; };  struct c1 {     char const* str;      template <typename t> operator t() const      { std::cout << "convert " << typeid(t).name() << "\n"; return {}; } };  struct c2 {     c2(c1);     template<typename t = std::initializer_list<std::pair<char const*, int>>>     c2(typename id<t>::type); };  int main() {     c1 c1{};     c2 c2{c1};     c2 c21({c1}); } 

Comments

Popular posts from this blog

javascript - Chart.js (Radar Chart) different scaleLineColor for each scaleLine -

apache - Error with PHP mail(): Multiple or malformed newlines found in additional_header -

java - Android – MapFragment overlay button shadow, just like MyLocation button -