C++ Как узнать список полей класса внутри template [дубликат]

286
12 февраля 2017, 11:38

На данный вопрос уже ответили:

  • Перечисление полей структуры 3 ответа

Хочу создать функцию которая будет пробегаться по всем полям класса и задавать им значения либо 0, если поле числовое, либо пустую строку, если поле строковое.

Что то вроде того func<Class>(obj);

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

Подскажите возможно ли это, или движок шаблонов С++ не настолько развит чтобы делать такие вещи?

Возможно есть какой-то трюк с макросами?

Answer 1

Вариант очистки структуры на базе ответа, ранее упомянутого в комментарии:

#include <iostream>
#include <string>
#define STRUCT_FIELDS \
    X(int, i) \
    X(double, d) \
    X(std::string, c) 
struct S {
    #define X(type, name) type name;
        STRUCT_FIELDS
    #undef X
};
template<typename T> 
void f(T& t)
{
    t = T();
}
void clear(S& s) {
    #define X(type, name) f(s.name);
        STRUCT_FIELDS
    #undef X
}
int main() {
    S s { 1, 42.1, "c" };
    std::cout << s.i << "[" << s.c << "]" << s.d << "\n";
    clear(s);
    std::cout << s.i << "[" << s.c << "]" << s.d << "\n";;
}

Результат выполнения:

1[c]42.1
0[]0
READ ALSO
Как получить снимок экрана в строковый буфер на C++?

Как получить снимок экрана в строковый буфер на C++?

Задача - удалённый мониторинг рабочего стола сотрудникаДля передачи через сокет нужен строковый буфер с jpeg-снимком всего того, что происходит...

248
Почему не могу добавить элемент из вектора в вектор?

Почему не могу добавить элемент из вектора в вектор?

Во-первых, insert для вектора требует два параметра - куда вставлять, и что вставлятьВы передаете только что

304
Запретить подключение DLL к программе

Запретить подключение DLL к программе

Как можно реализовать запрет на подключение DLL к выполняемому процессу на программном уровне? Программа написана на C++Среда разработки Visual...

223
Создание больших файлов через WinAPI.

Создание больших файлов через WinAPI.

ЗдравствуйтеРаботаю в C++ Builder 6

267