Здравствуйте, sergii.p, Вы писали:
SP>SP>const auto [it, was_added] = v_map.try_emplace(v_key, v_arg);
SP>auto& [key, value] = *it;
SP>if(was_added) {
SP> value.some_method();
SP>}
SP>
Вот бы можно было так без auto :
[my_map::iterator it, bool was_added] = v_map.try_emplace(v_key, v_arg);
SP>Вообще, конечно заводить структуры вроде как правильно и особо тут спорить не о чем, но предложу другой подход: усилить систему типов.
SP>SP>template<typename Name> struct NewStringType {
SP> ...
SP>};
SP>using MuduleName = NewStringType<struct ModuleNameHelp>;
SP>using VarName = NewStringType<struct VarNameHelp>;
SP>
Чтобы нельзя было сравнивать имя модуля с именем переменной?
Вот тут как раз можно бы и обобщить. Такая обёртка подошла бы не только для строк. Назвать к примеру
wrap, и добавить как параметр шаблона хранимый тип.
template <typename T, typename Unique>
struct wrap {
using value_type = T;
using unique_type = Unique;
// data
value_type value;
friend bool operator == (const wrap &, const wrap &) = default;
friend auto operator <=> (const wrap &, const wrap &) = default;
};
Но мне кажется, что на этот случай наверняка должно быть уже готовое решение.