On 4/7/19 10:59 PM, degski via Boost wrote:
On Sun, 7 Apr 2019 at 18:44, Robert Ramey via Boost <boost@lists.boost.org> wrote:
template<T ...> struct safe_variant : public std::variant<T...> { // for each T static assert that is_trivially_constructible<T> == true };
Which gets trickier. But would be cool if someone wanted to make this.
#include <type_traits> #include <variant>
struct Foo { Foo ( ) = delete; };
template<typename... Args> struct safe_variant : public std::variant<Args...> { static_assert ( std::conjunction<std::is_trivially_constructible<Args>...>::value, "is not trivially constructible" ); };
int main ( ) {
safe_variant<int, double, bool> sv1; // compiles // safe_variant<int, double, bool, Foo> sv2; // does not compile }
Unless I mis-understand what you mean, this does the trick.
degski
LOL - Looks good to me! So now we have std::variant that is guaranteed to have a valid state with no double buffer BS and no extra overhead. I'll be curious to hear what otherothers have to say about this. Robert Ramey