int main()
{
    cout << "Hello World" << endl;
    sample s1("Go to bed");
    s1.display();
    cout <<"\n\n\ Calling explicit constructor"<<endl;
    s1.~sample();
    s1.display();
    cout << "***************"<<endl;
    // This function gives run time error, as you try to delete object/ try to access object which is already deleted.
}
            policy::ctor::as_object
        )
        .constructor(&ctor_test::create_object)
        .constructor(&global_create_object);
}

////////////////////////////////////////////////////////////////////////////////////////

TEST_CASE("constructor - retrieve", "[constructor]")
{
    type t = type::get<ctor_test>();
    REQUIRE(t.is_valid() == true);

    SECTION("retrieve default ctor")
    {
        constructor ctor = t.get_constructor();
        CHECK(ctor.is_valid() == true);
        CHECK(static_cast<bool>(ctor) == true);
    }

    SECTION("retrieve copy-ctor")
    {
        constructor ctor = t.get_constructor({type::get<ctor_test>()});
        CHECK(ctor.is_valid() == true);
        CHECK(static_cast<bool>(ctor) == true);
    }

    SECTION("retrieve custom ctor")
    {
        constructor ctor = t.get_constructor({type::get<int>(), type::get<double>()});
        CHECK(ctor.is_valid() == true);
        .constructor(select_overload<ctor_func_invoke_arg_test(int, int, int, int, int, int)>(&ctor_func_invoke_arg_test::create))
        .constructor(select_overload<ctor_func_invoke_arg_test(int, int, int, int, int, int, int)>(&ctor_func_invoke_arg_test::create))
        ;
#endif
}

////////////////////////////////////////////////////////////////////////////////////////

TEST_CASE("constructor - invoke general", "[constructor]")
{
    type t = type::get<ctor_invoke_test>();
    REQUIRE(t.is_valid() == true);

    SECTION("invoke default ctor")
    {
        constructor ctor = t.get_constructor();
        REQUIRE(ctor.is_valid() == true);

        variant var = ctor.invoke();
        CHECK(var.is_valid() == true);
        CHECK(var.get_type() == type::get<ctor_invoke_test*>());
        ctor_invoke_test* obj = var.get_value<ctor_invoke_test*>();
        CHECK(obj->default_ctor_invoked == true);
        CHECK(t.get_destructor().invoke(var) == true);
    }

    SECTION("invoke copy-ctor")
    {
        constructor ctor = t.get_constructor({type::get<ctor_invoke_test>()});
        REQUIRE(ctor.is_valid() == true);