我正在尝试定义一个可以处理用户定义的类型和结构的模板。到目前为止的问题是我无法通过类型定义获取结构成员的信息。模板假设检测结构数据类型并相应地处理不同的成员类型。
到目前为止,我提出的解决方案涉及一个类型字符串向量,用于表示成员元素的数量和类型:
std::vector<std::string> typeList
程序然后遍历列表并根据typeList处理结构。到目前为止,根本没有对给定结构进行检查,因此如果传入不同的结构,则行为未定义。
我的问题是,是否有任何优雅的方法可以实现这一目标?我更喜欢解决方案来检查传入结构本身以获取此类型列表信息,而不是依赖于第二个数据结构。
非常感谢。
答案 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
}
}
与模板特化和“标记类”的组合允许处理类型以及不为此接口提供相同的函数签名。