switch для std::string C++
Уважаемые Гуру, скажите, приемлим ли такой подход для практического применения:
#include <functional>
#include <iostream>
#include <memory>
#include <string>
#include <map>
class Base
{
public:
Base() = default;
virtual ~Base() = default;
virtual void proc() = 0;
};
class Derived_1 : public Base
{
public:
Derived_1() = default;
virtual ~Derived_1() = default;
virtual void proc() override
{ return; }
};
class Derived_2 : public Base
{
public:
Derived_2() = default;
virtual ~Derived_2() = default;
virtual void proc() override
{ return; }
};
class Impl
{
std::unique_ptr<Base> uptr_deriv;
public:
Impl() = default;
~Impl() = default;
void assign_uptr(std::string what)
{
using lambda = std::function<void()>;
using msl = std::map<std::string, lambda>;
std::unique_ptr<Base> uptr_temp;
msl SWITCH_STR;
SWITCH_STR["Derived_1"] =
[&uptr_temp]()
{
std::cout << "Assigning Derived_1" << std::endl;
uptr_temp = std::make_unique<Derived_1>();
};
SWITCH_STR["Derived_2"] =
[&uptr_temp]()
{
std::cout << "Assigning Derived_2" << std::endl;
uptr_temp = std::make_unique<Derived_2>();
};
SWITCH_STR[what]();
uptr_deriv = std::move(uptr_temp);
}
};
int main(int argc, char *argv[])
{
Impl i;
i.assign_uptr("Derived_1");
i.assign_uptr("Derived_2");
i.assign_uptr("Derived_1");
i.assign_uptr("Derived_2");
i.assign_uptr("Derived_1");
i.assign_uptr("Derived_2");
}
Вывод:
Assigning Derived_1
Assigning Derived_2
Assigning Derived_1
Assigning Derived_2
Assigning Derived_1
Assigning Derived_2
Ответы (1 шт):
Автор решения: user7860670
→ Ссылка
посоревнуемся в знании толка? посоревнуемся
#include "string_case.hpp"
#include <iostream>
int
main(int const argc, char const * const * const pp_args)
{
::std::string some_arg{pp_args[1]};
switch(_s, some_arg)
{
case "first"_s:
{
::std::cout << "first case" << ::std::endl;
break;
}
case "second"_s:
{
::std::cout << "second case" << ::std::endl;
break;
}
default:
{
::std::cout << "default case" << ::std::endl;
break;
}
}
return 0;
}
как оно работает (пишу пониже, чтобы читатель сразу не шарахался)
// string_case.hpp
#include <cstddef>
#include <string>
enum class
case_id
{ unknown
, first
, second
};
[[nodiscard]] constexpr auto
impl(char const * const psz) noexcept
{
if(('f' == psz[0]) and ('i' == psz[1]) and ('r' == psz[2]) and ('s' == psz[3]) and ('t' == psz[4]) and ('\0' == psz[5]))
{
return case_id::first;
}
if(('s' == psz[0]) and ('e' == psz[1]) and ('c' == psz[2]) and ('o' == psz[3]) and ('n' == psz[4]) and ('d' == psz[5]) and ('\0' == psz[6]))
{
return case_id::second;
}
return case_id::unknown;
}
constexpr class
{
public: [[nodiscard]] constexpr auto
operator ,(char const * const psz) const noexcept
{
return impl(psz);
}
public: [[nodiscard]] case_id
operator ,(::std::string const & s) const noexcept
{
return impl(s.c_str());
}
} _s;
[[nodiscard]] constexpr auto
operator ""_s(char const * const psz, [[maybe_unused]] ::std::size_t const size) noexcept
{
return impl(psz);
}