এখানে কমপক্ষে একটি মামলা দেওয়া হল:
struct foo {
template<class T>
operator T() const {
std::cout << sizeof(T) << "\n";
return {};
}
};
যদি আপনি এটি করেন তবে foo f; int x = f; double y = f;
টাইপ তথ্যটি "পিছনের দিকে" প্রবাহিত হবে T
যা ভিতরে রয়েছে তা বের করার জন্য operator T
।
আপনি এটি আরও উন্নত উপায়ে ব্যবহার করতে পারেন:
template<class T>
struct tag_t {using type=T;};
template<class F>
struct deduce_return_t {
F f;
template<class T>
operator T()&&{ return std::forward<F>(f)(tag_t<T>{}); }
};
template<class F>
deduce_return_t(F&&)->deduce_return_t<F>;
template<class...Args>
auto construct_from( Args&&... args ) {
return deduce_return_t{ [&](auto ret){
using R=typename decltype(ret)::type;
return R{ std::forward<Args>(args)... };
}};
}
তাই এখন আমি করতে পারি
std::vector<int> v = construct_from( 1, 2, 3 );
এবং এটি কাজ করে।
অবশ্যই, কেন না কেন {1,2,3}
? ভাল, {1,2,3}
একটি অভিব্যক্তি নয়।
std::vector<std::vector<int>> v;
v.emplace_back( construct_from(1,2,3) );
যা স্বীকার করে নিন, এর জন্য আরও কিছুটা জাদুকরী প্রয়োজন: লাইভ উদাহরণ । (আমাকে ছাড়ের ফিরতি একটি SFINAE চেক করতে হবে, তারপরে এফটিকে SFINAE বান্ধব করে তুলতে হবে, এবং আমাকে অনুমান_আরক্ষক_আপনার টি তে স্ট্যান্ড :: আরম্ভকারী_লিস্ট ব্লক করতে হবে)