将未知结构(在运行时)作为模板参数传递

时间:2018-05-07 22:22:21

标签: c++ c++11 templates

我正在尝试创建一个通用模板函数,它将在运行时接受未知结构作为参数。通过Unknown结构,我的意思是我不会知道struct成员变量名及其相应的数据类型和值。然后,该函数应逐个推导出所有结构成员的类型及其对应的值。我不关心结构成员计数,因为我可以有一个结构成员函数返回数字(硬编码)。我无法理解的是如何在运行时动态获取传入的结构成员类型及其对应的值。这是我的代码,直到现在:

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 :(得分:1)

简短回答:你不能。

答案很长:您可以针对模板功能的具体实现。

到目前为止你所拥有的是一个良好的开端,但你还需要一件事。您需要为希望能够转换为字符串的特定结构定义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()方法的结构都会调用你的通用的。 (然后你可以返回&#34; [未知]&#34;或类似的)