+ 2
C++: How to enable std::apply for user-define class?
I found in the reference that std::apply works not only with std::tuple, but also with other types like std::pair and std::array which support std::tuple_size and std::get. https://en.cppreference.com/w/cpp/utility/apply This made me wonder if I can enable std::apply for a class by overloading std::tuple_size and std::get for them. I tried doing this (I hope the code is clear enough, feel free to point out if it isn't) https://code.sololearn.com/c87G8s5r04U0/?ref=app For some reason, the std::get implementation provided by me for `Container` isn't even considered by the compiler. 1. Is what I'm trying to do possible? 2. If yes, then what am I doing wrong?
2 Réponses
+ 1
Doesn't extending stl leads to undefined behaviour ?
+ 1
Arsenic
Well, I didn't know that.
From https://en.cppreference.com/w/cpp/language/extending_std:
"It is allowed to add template specializations for any standard library class template to the namespace std only if the declaration depends on at least one program-defined type and the specialization satisfies all requirements for the original template, except where such specializations are prohibited."
So I guess my specialization for std::tuple_size is fine
"It is undefined behavior to declare a full specialization of any standard library function template."
Does this mean my overload for std::get is not allowed? That might explain why the compiler does not consider that overload. So is it safe to conclude that this is the reason?
I still find it weird though that I can still call the std::get overload and it works fine. But it doesn't work when used in std::apply. I mean, this works fine
`std::cout << std::get<1>( Container<A, B, C>{} );`
Thanks for your help