Аттрибуты для полей класса
От: tapatoon  
Дата: 26.03.25 17:06
Оценка:
Имеем класс вроде такого
class A
{
  string s;
  int i;
};

Менять его описание не можем. Может содержать виртуальные функции, наследоваться в т.ч. виртуально и т.п.
Хочу для каждого мембера (для методов не надо) задать пару атрибутов в компайлтайме и когда нужно их получать.

Не придумал ничего лучше такого
class B : A
{
  template<class T, const int IntAttr, const char* StrAttr> struct MyField
  {
    T& value;
    constexpr int int_attr = IntAttr;
    constexpr const char* str_attr = StrAttr;
  };

  MyField<string, 1, str1> sField { s };
  MyField<int, 2, str2> iField { i };
}

Лишняя ссылка на значение очень не нравится. Да и дополнительное поле, через которое нужно идти к value тоже. Есть идеи как лучше сделать?
Центр ИПсО Сил Специальных Операций
Re: Аттрибуты для полей класса
От: T4r4sB Россия  
Дата: 26.03.25 17:13
Оценка:
T>Лишняя ссылка на значение очень не нравится. Да и дополнительное поле, через которое нужно идти к value тоже. Есть идеи как лучше сделать?

Мне не нравится что атрибуты хранятся в полях объекта, они точно разные для разных экземпляров?
Я понимаю, что там есть ссылки, из-за которых их не сделать статик полем, но тогда типа сделать
Metatable getFieldMetatable() {
}

Которая возвращает структуру в которой уже ссылки на поля
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: Аттрибуты для полей класса
От: tapatoon  
Дата: 26.03.25 17:24
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Мне не нравится что атрибуты хранятся в полях объекта, они точно разные для разных экземпляров?

Одинаковые и они же constexpr (static, кстати, забыл перед constexpr), места не занимают.
Да и хочется аттрибуты иметь там же, где работаю с полями, без доп функций.
типа
B b;
doSomethingWithValueAndAttributes(b.s.value, b.s.int_attr, b.s.str_attr);
Центр ИПсО Сил Специальных Операций
Re: Аттрибуты для полей класса
От: kov_serg Россия  
Дата: 26.03.25 21:12
Оценка: 5 (2) +1
Здравствуйте, tapatoon, Вы писали:

T>Имеем класс вроде такого

T>Менять его описание не можем. Может содержать виртуальные функции, наследоваться в т.ч. виртуально и т.п.
T>Хочу для каждого мембера (для методов не надо) задать пару атрибутов в компайлтайме и когда нужно их получать.
T>Есть идеи как лучше сделать?

Например так: https://godbolt.org/z/c6YWGc58d
struct A {
    string s;
    int i;
};

template<auto>struct Info;
template<>struct Info<&A::s> { enum { id=1 }; static const char* name() { return "string"; } };
template<>struct Info<&A::i> { enum { id=2 }; static const char* name() { return "integer"; } };
Re[2]: Аттрибуты для полей класса
От: tapatoon  
Дата: 27.03.25 02:59
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>...

Спасибо, думал что для одинаковых типов мемберов такое работать не будет
Центр ИПсО Сил Специальных Операций
Отредактировано 27.03.2025 6:15 tapatoon . Предыдущая версия . Еще …
Отредактировано 27.03.2025 5:16 tapatoon . Предыдущая версия .
Re[2]: Аттрибуты для полей класса
От: rg45 СССР  
Дата: 14.04.25 12:46
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Например так: https://godbolt.org/z/c6YWGc58d

_>
_>struct A {
_>    string s;
_>    int i;
_>};

_>template<auto>struct Info;
_>template<>struct Info<&A::s> { enum { id=1 }; static const char* name() { return "string"; } };
_>template<>struct Info<&A::i> { enum { id=2 }; static const char* name() { return "integer"; } };
_>


Сдаётся мне, это неплохой повод, чтобы использовать самый честный компайл-тайм счётчик на свете
Автор: rg45
Дата: 27.11.24
. Чтобы исключить возможные ошибки при ручном проставлении идентификаторов:

https://coliru.stacked-crooked.com/a/79b32183d6288b09

struct A {
    std::string s;
    int i;
};

template<auto>struct Info;
template<>struct Info<&A::s> { enum { id = compile_time::ct_tick<A> }; static const char* name() { return "string"; } };
template<>struct Info<&A::i> { enum { id = compile_time::ct_tick<A> }; static const char* name() { return "integer"; } };

int main() {
    std::cout << Info<&A::s>::id << ", " << Info<&A::s>::name() << std::endl;
    std::cout << Info<&A::i>::id << ", " << Info<&A::i>::name() << std::endl;
}
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 14.04.2025 12:50 rg45 . Предыдущая версия . Еще …
Отредактировано 14.04.2025 12:47 rg45 . Предыдущая версия .
Re[3]: Аттрибуты для полей класса
От: kov_serg Россия  
Дата: 14.04.25 13:10
Оценка: +2
Здравствуйте, rg45, Вы писали:

R>Сдаётся мне, это неплохой повод, чтобы использовать самый честный компайл-тайм счётчик на свете
Автор: rg45
Дата: 27.11.24
. Чтобы исключить возможные ошибки при ручном проставлении идентификаторов:


Тут есть другая засада, если нам нужны уникальные идентификаторы. То луше их сразу фигачить в базу данных, чтобы потом с разными версиями можно было работать единообразно.
То есть складывать идентификаторы в базу, указывать что, и в какой версии появилось, а что выкинуто. И потом можно делать разные запросы с эти данным.
В том числе генерировать заголовочные файлы с кучей enum-ом в разных namespace-ах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.