Просто, я люблю упороться
вот там мы у себя упарывались, борясь за порядок следования однотипных аргументов
template<size_t TAG>
struct Part {
std::string value;
};
enum PARTS {
NAME,
SURNAME,
PATRONYMIC,
};
struct FullName {
std::string name;
std::string patronymic;
std::string surname;
FullName(Part<NAME>&& name, Part<PATRONYMIC>&& patronymic, Part<SURNAME>&& surname) : name(std::move(name.value)), patronymic(std::move(patronymic.value)), surname(std::move(surname.value)) {
}
FullName(Part<SURNAME>&& surname, Part<NAME>&& name, Part<PATRONYMIC>&& patronymic) : name(std::move(name.value)), patronymic(std::move(patronymic.value)), surname(std::move(surname.value)) {
}
};
int main()
{
FullName fn1{ Part<NAME>{"Ivan"}, Part<PATRONYMIC>{}, Part<SURNAME> {"Ivanov"} };
FullName fn2{ Part<SURNAME> {"Ivanov"}, Part<NAME>{"Ivan"}, Part<PATRONYMIC>{} };
}
здесь нет оверхеда, но сущностей дохера, благо, что у нас это генеренный код. Но лучше сделать builder, на мой взгляд