Передача неизвестной структуры (во время выполнения) в качестве параметра шаблона - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь создать универсальную функцию шаблона, которая будет принимать неизвестную структуру в качестве параметра во время выполнения. Под неизвестной структурой я подразумеваю, что у меня не будет знаний об именах переменных членов структуры и их соответствующих типах данных и значениях. Функция должна затем определить тип всех элементов структуры, один за другим, и их соответствующие значения. Меня не касается количество членов структуры, так как у меня может быть функция члена структуры, возвращающая числа (жестко закодированные). Что я не могу понять, так это как получить входящие типы элементов структуры и их соответствующие значения динамически во время выполнения. Вот мой код до сих пор:

struct test1 //Any struct of this type will be passed as a parameter to the template function, with more or less the same data types
{
    int n1;
    double d1;
    std::string s1;
    double d2;
    std::string s2;

    int sCount() { return 5; } //Hardcoded
};

    template <class T>
    std::string structToString(const T& st)     //Pass unknown struct as input
    {
        //I am not able to understand how to get all the structure members, one by one, and their types and values at run time

    }

    int main()
    {
        test1 obj = { 0 };
        obj.n1 = 10;
        obj.d1 = 12.23;
        obj.s1 = "XYZ1";
        obj.d2 = 13.65;
        obj.s2 = "ABC1";

        structToString<test1>(obj);

    return 0;
    }

Возможно, я могу использовать что-то вроде typeid(T).name() для каждого из членов структуры, чтобы получить их типы, но как перебрать все (неизвестные) члены, а также получить их значения.

Заранее спасибо ...

1 Ответ

0 голосов
/ 08 мая 2018

Краткий ответ: Вы не можете.

Длинный ответ: Вы можете для конкретных реализаций вашей функции шаблона.

То, что у вас есть, - хорошее начало, но вам нужна еще одна вещь. Вам необходимо определить функцию structToString() для конкретной структуры, которую вы хотите преобразовать в строку. Вот так:

template <>
std::string structToString(const test1& st)     //Pass KNOWN struct as input
{
    // Now you have access to struct test1's member data
}

Теперь, каждый раз, когда вы вызываете structToString() с объектом test1, он будет вызывать этот новый метод, но любые другие структуры, которые не определяют метод structToSting(), будут вызывать ваш универсальный метод. (Который вы могли бы затем вернуть «[Неизвестно]», или подобное)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...