다음은 하나 이상의 경우입니다.
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) );
사실, 좀 더 마법이 필요합니다 : Live example . (나는 추론 반환을 F의 SFINAE 검사를 수행하고 F를 SFINAE 친화적으로 만들고 deduce_return_t 연산자 T에서 std :: initializer_list를 차단해야합니다.)