Недавно я начал использовать кортежи вместо простых членов класса, потому что считаю, что с ними удобно работать. Итак, мой код выглядит примерно так:
class TestClass final {
public:
TestClass() = default;
~TestClass() = default;
public:
template<int M>
auto get()->decltype(std::get<M>(m_private_members)) const {
return std::get<M>(m_private_members);
}
enum PrivateIdx {
count,
use_stuff,
name
};
private:
std::tuple<int, bool, std::string> m_private_members{1, true, "bla"};
};
Так что теперь это можно использовать как:
std::cout << t.get<TestClass::name>()> << std::endl;
Это тоже работает нормально - единственное, добавление членов может быть довольно подвержено ошибкам. Можно легко ошибиться в перечислениях доступа, перепутав порядок или забыв член. Я думал о вещах в стиле макроса, например:
PUBLIC_MEMBERS(
MEMBER(int count),
MEMBER(std::string name)
);
Это расширит код кортежа и перечисления. Проблема в том, что я не думаю, что это можно решить с помощью макроса, потому что это две разные структуры данных, до которых он должен расширяться, верно? Также, должен признаться, я никогда не изучал сложные макросы.
Я также думал о шаблоне для решения этой проблемы, но я также не мог придумать жизнеспособного решения, потому что перечисления не могут быть сгенерированы шаблоном.
FOO( (int,count,1)(bool,use_stuff,true)(std::string,name,"blah") )
. - person HolyBlackCat   schedule 10.06.2018C++17
, вы можете разрешить привязку структуры для своего класса, сделав его разрушаемым (имея метод get‹› и специализации std::tuple_size‹› и std::tuple_element‹›), смотрите здесь: cpp-today.blogspot.com/2017/03/ - person ZivS   schedule 10.06.2018