2014-09-09 3 views
4

Мне нужно создать некоторый механизм, который позволит мне объявить свойства класса (т. Е. Переменные-члены), к которым можно получить доступ через их имя, а также от обычного доступа к члену класса. Qt решил эту проблему с помощью очень удобного макроса Q_PROPERTY, который на другом конце переваривается moc. Я не роскошь этого двухстадийной компиляции и ближе всего я мог бы получить это:Создание свойств класса с помощью макроса

class SomeClass 
{ 
public: 
SomeClass() : bla(9), v(9.4) {} 
virtual ~SomeClass(){} 

int bla; 
double v; 

BEGIN_ATTRIBUTES(SomeClass) 
    ATTRIBUTE(int, bla) 
    ATTRIBUTE(double, v) 
END_ATTRIBUTES() 
}; 

где есть очевидные макросы, которые скрывают уродливый механизм для хранения некоторых данных о члене класса, который подается в ужасный шаблонный монстр кода, и это работает, но это имеет тот недостаток, что вам нужно сначала объявить атрибуты класса, а затем у вас есть отдельный раздел, в котором вы фактически указываете член класса как атрибут.

Я бы еще как-то код, как:

class SomeClass 
{ 
public: 
SomeClass() : bla(9), v(9.4) {} 
virtual ~SomeClass(){} 

ATTRIBUTE(int, bla); 
ATTRIBUTE(double, v); 
}; 

Но независимо от того, насколько сильно я стараюсь, я просто не могу приблизиться к этой одной подкладке решения. Если бы кто-нибудь когда-либо реализовал что-то подобное, я был бы благодарен за несколько советов.

+0

Почему хуже использовать Q_PROPERTY чем переопределять его? – nib

ответ

1

Прежде всего позвольте мне заметить, что свойства не являются идиоматическими C++, и язык не поддерживает ваши попытки использовать их.

Тем не менее, хотя ваш вопрос не ясно, пытались ли вы что-то вроде:

#define ATTRIBUTE(type, name) \ 
type name##_; \ 
const type& get_##name() const { return name##_; } \ 
void set_##name(const type& v) { name##_ = v; } 

class SomeClass 
{ 
public: 
    SomeClass() : bla_(9), v_(9.4) {} 
    virtual ~SomeClass(){} 

    ATTRIBUTE(int, bla); 
    ATTRIBUTE(double, v); 
}; 
+0

Да, это была моя первая попытка (ну не совсем, но что-то подобное в любом случае), но я столкнулся с проблемой, когда попытался реализовать доступ по имени. Например, 'setAttribute (" v ", 10.45);' или 'double x = attribute (" v ");' – fritzone

+0

@fritzone Можете ли вы рассказать о реальной проблеме, которую пытаетесь решить? Похоже, вы пытаетесь написать код для другого языка на C++. C++ не является динамическим способом, который легко позволяет вам это сделать. –

+0

Я создал механизм сериализации, используя синтаксис в вопросе, с двумя идентификаторами атрибутов (сначала это нормальное объявление переменной, а второе - идентификация атрибута, где макрос расширяется до функции, выполняющей все виды уродливые вещи (это на https://github.com/fritzone/cppserializer - извинения за рекламу собственного проекта)), но мне вроде не нравится это очень расширенное определение атрибута, и я пытаюсь выяснить, могу ли я сократить это как-то. – fritzone

Смежные вопросы