用于处理用户定义的类型和结构的模板

时间:2014-01-22 19:27:09

标签: c++ templates structure

我正在尝试定义一个可以处理用户定义的类型和结构的模板。到目前为止的问题是我无法通过类型定义获取结构成员的信息。模板假设检测结构数据类型并相应地处理不同的成员类型。

到目前为止,我提出的解决方案涉及一个类型字符串向量,用于表示成员元素的数量和类型:

std::vector<std::string> typeList

程序然后遍历列表并根据typeList处理结构。到目前为止,根本没有对给定结构进行检查,因此如果传入不同的结构,则行为未定义。

我的问题是,是否有任何优雅的方法可以实现这一目标?我更喜欢解决方案来检查传入结构本身以获取此类型列表信息,而不是依赖于第二个数据结构。

非常感谢。

1 个答案:

答案 0 :(得分:0)

我认为您所寻找的是模板专业化

例如,我们可以编写一个serialize方法,该方法对特定类型的实现方式不同:

template<typename T>
void serialize(const T& val)
{
     static_assert("No implementation for this type provided");
}

template<>
void serialize<std::string>(const std::string& val)
{
    // std::string specific implementation here
}

请注意,部分特化(mutli类型的特化)只适用于类模板。

无法检查类型genericaly(如在java或c#中),但您可以让自己的类型提供信息。

template<typename T>
class GenericSerializeable {};

struct Foo : public GenericSerializeable<Foo>
{
    int bar;

    static std::vector<std::string> GetMembers()
    {
        return {"bar"}; // we could of course return a more complex type here providing more informations
    }

};


// lets assume for a moment here that partial specialization is possible for functions, this is just a proof of concept
template<typename T>
void serialize(const GenericSerializeable<T>& type)
{
    for (auto name : T::GetMembers())
    {
        // do whatever you want with them here
    }
}

与模板特化和“标记类”的组合允许处理类型以及不为此接口提供相同的函数签名。