Я пытаюсь использовать систему свойств в классе.Невозможно получить тип возвращаемой функции constexpr auto
Свойство имеет соответствующий член-указатель, имя и int (из перечисления), чтобы однозначно идентифицировать его.
Вот код, который определяет свойство:
template<typename Class, typename T>
struct MemberProperty
{
constexpr MemberProperty(T Class::*aMember, const char* aName, int aId)
: member(aMember), name(aName), id(aId)
{}
T Class::*member;
const char* name;
int id;
};
я создаю свойства, вызвав эту функцию:
template <typename Class, typename T>
constexpr auto makeProperty(T Class::*member, const char* name, int id) {
return MemberProperty<Class, T>{member, name, id};
}
Моя цель заключается в определении свойств класса, как это:
class User
{
public:
enum PropertiesEnum
{
Property_Name
};
string m_name;
static constexpr auto Properties() {
return std::make_tuple(
makeProperty(&User::m_name, "name", User::Property_Name)
);
}
using PropertiesType = decltype(Properties());
//PropertyManager<PropertiesType> m_propertyManager;
};
Я хотел был бы иметь возможность раскомментировать линию, которая объявляет m_propertyManager
, Проблема в том, что это не скомпилировано. В г ++, я получаю:
error: use of 'static constexpr auto User::Properties()' before deduction of 'auto'
В Visual Studio 2015, я получаю:
error C3779: 'User::UserProperties': a function that returns 'auto' cannot be used before it is defined
Как я могу сделать эту работу? Это похоже на циркулирующую зависимость, но я не могу найти, как заставить ее работать. Вот пример:
http://coliru.stacked-crooked.com/a/24e7f5ea7f83da6f
Я думаю '-> decltype (std :: make_tuple (makeProperty (& User :: m_name," name ", User :: Property_Name)))' в декларации помог ... [live demo] (http: // coliru.stacked-crooked.com/a/a7f291a384992464) –
Спасибо, что все работает. Но есть ли другой путь? Параметры make_tuple потенциально очень большие (я добавлю много свойств) – Michael
Обычно я использую MACRO, чтобы избежать повторения: '#define RETURN (ret) -> decltype (ret) {return ret; } ' – Jarod42