TheAny
Megapat
- Katılım
- 18 Aralık 2018
- Mesajlar
- 7.827
- Makaleler
- 13
- Çözümler
- 106
Merhaba;
Gorgon: Summary üzerinde map vb sistemler için bir şey geliştiriyorum. Gorgon'un içerisinde Struct.h kısmına baktığınızda reflection becerisini olduğunu göreceksiniz. Bu becerisinden yararlanıp setbyname adında bir fonksiyon oluşturdum. Şimdi aynı mantıkla getbyname oluşturmak istiyorum.
Aşağıda SetByName var.
Aynı mantıktan yola çıkarak önce şunu yaptım;
Fakat yukarıdakinin problemi, ilk returnden sonra duracak olması. İlk yazarken aklıma gelmemişti duracağı. :') Sonrasında
Fakat hala any kullandığım için, cast etmem gerekiyor. cast olmadan otomatik olarak type'ına göre döndürebilmek istiyorum. İyice beynim yanmaya başladı. Nasıl çözebilirim?
@Vavien.
Gorgon: Summary üzerinde map vb sistemler için bir şey geliştiriyorum. Gorgon'un içerisinde Struct.h kısmına baktığınızda reflection becerisini olduğunu göreceksiniz. Bu becerisinden yararlanıp setbyname adında bir fonksiyon oluşturdum. Şimdi aynı mantıkla getbyname oluşturmak istiyorum.
Aşağıda SetByName var.
C++:
// Using Gorgon's Reflection system to handle member assignments.
namespace internal {
template<class T_, int Ind>
// Sets the member by name if the name exists in the structure's reflection.
void SetByName_setif(T_ &obj, const std::string &name, const std::string &value) {
if(T_::Reflection().Names[Ind] == name)
obj.*(T_::ReflectionType::template Member<Ind>::MemberPointer()) = Gorgon::String::To<typename T_::ReflectionType::template Member<Ind>::Type>(value);
}
// Since we can't travel template members in run time, we use Gorgon Sequence for to do that using template parameters.
template<class T_, int ...S_>
void SetByName_expand(Gorgon::TMP::Sequence<S_...>, T_ &obj, const std::string &name, const std::string &value) {
(SetByName_setif<T_, S_>(obj, name, value), ...);
}
}
// Caller for the above.
template<class T_>
void SetByName(T_ &obj, const std::string &name, const std::string &value) {
internal::SetByName_expand(typename Gorgon::TMP::Generate<T_::ReflectionType::MemberCount>::Type{}, obj, name, value);
}
Aynı mantıktan yola çıkarak önce şunu yaptım;
C++:
template<class T_, int Ind>
auto GetByName_getif(const T_& obj, const char* name) -> T_::ReflectionType::template Member<Ind>::Type {
if (T_::Reflection().Names[Ind] == name) {
return obj.*(T_::ReflectionType::template Member<Ind>::MemberPointer());
}
return {};
}
template <class T_, int ...S_>
auto GetByName_expand(Gorgon::TMP::Sequence<S_...>, const T_& obj, const char * name) {
return (GetByName_getif<T_, S_>(obj, name), ...);
}
template <class T_>
auto GetByName_(const T_& obj, const char * name) {
return GetByName_expand(typename Gorgon::TMP::Generate<T_::ReflectionType::MemberCount>::Type{}, obj, name);
}
Fakat yukarıdakinin problemi, ilk returnden sonra duracak olması. İlk yazarken aklıma gelmemişti duracağı. :') Sonrasında
std::any
'den yararlanıp şöyle bir şey yazdım;
C++:
class Get {
private:
std::any value;
template<class T_, int Ind>
void ByName_getif(const T_& obj, const std::string& name) {
value.reset();
if (T_::Reflection().Names[Ind] == name)
value = obj.*(T_::ReflectionType::template Member<Ind>::MemberPointer());
}
template <class T_, int ...S_>
void ByName_expand(Gorgon::TMP::Sequence<S_...>, const T_& obj, const std::string& name) {
(ByName_getif<T_, S_>(obj, name), ...);
}
public:
template <class T_>
std::any ByName(const T_& obj, const std::string& name) {
ByName_expand(typename Gorgon::TMP::Generate<T_::ReflectionType::MemberCount>::Type{}, obj, name);
return value;
}
template <class T_>
std::any operator()(const T_& obj, const std::string& name) {
return ByName(obj, name);
}
};
Get GetByName;
Fakat hala any kullandığım için, cast etmem gerekiyor. cast olmadan otomatik olarak type'ına göre döndürebilmek istiyorum. İyice beynim yanmaya başladı. Nasıl çözebilirim?
@Vavien.
Son düzenleyen: Moderatör: