2016-04-11 19 views
0

Yapmak istediğim şey aşağıdaki gibi bir şeydir.Makro ekleme üyesi var ve kurucuyu etkiliyor

class MyClass { 
    list<FieldType> allFields; 
    ADDFIELD(field1, Type, args); 
    ADDFIELD(field2, Type, args); 

    MyClass(){ 
     MAKE_FIELD_LIST(); 
    } 
} 

ve MAKE_FIELD_LIST() her alan listesi nesnesine allFields içine ADDFIELD kullanılarak eklenen koyacağız Nerede

class MyClass { 
    list<FieldType> allFields; 
    Type field1 = Type(args); 
    Type field2 = Type(args); 
    MyClass(){ 
     allFields.put(field1); 
     allFields.put(field2); 
    } 
} 

genişletmek var. Geçmişte makroları daha basit şeyler için kullandım, ancak MAKE_FIELD_LIST tarafından kullanılacak bir dizi değişken isminin saklanıp ekleyebilmesinin bir yolu olup olmadığını anlayamıyorum.

+2

Neden bunu istiyorsunuz? – GManNickG

+1

"Aşağıdaki gibi bir şey" sonucunun ne olmasını bekliyorsunuz? Makrolarla çalışırken önemli bir adım, neyi genişletmesi gerektiğini tanımlamaktır. – molbdnilo

+0

@GManNickG, her alanın bir tamponda bir aralık için bir referans olduğu bir dizi nesneye sahiptir. Üyelerin hepsinin onaylanması ve bir liste nesnesine sahip olmalarının önemli ölçüde kolaylaşacağı zamanlar vardır. Diğer zamanlarda bir üyeye isme göre erişebilmek tercih edilir. – Jias

cevap

0

Yapmanız gereken tek şey, ayrı bir üye kullanmak yerine tek bir tuple kullanmanızdır. Sınıfı bir map dizeyle ilişkilendirebilirsiniz, ayrıca doğru öğeye erişebilirsiniz.

class foo 
{ 
public: 
    template <typename T> 
    void AddMember(const T& t) { 
     std::tuple_cat(members_, std::make_tuple(t)); 
    } 
private: 
    std::tuple<>members_; 
}; 
+0

Maalesef, C++ 98'i zorlukla destekleyen eski bir derleyici kullanıyoruz. C++ 11 sınıflarını kullanabilmeyi hayal ediyorum. – Jias

+0

gerçekten? neden yükseltmedin? Yükseltmek çok basit olduğunda böyle bir derleyici ile sıkışmış olduğunuz bana aptalca görünüyor. –