gpt4 book ai didi

c++ - 模板类可以用作模板函数特化的参数吗?

转载 作者:行者123 更新时间:2023-11-30 01:10:27 26 4
gpt4 key购买 nike

我有以下模板函数:

template <class T>
inline T ParseValueFromJson(const JSONValue& jsonValue);

依次用于其他模板函数,例如:

template <class T>
bool TryGetValueFromJson(
const JSONValue& jsonValue,
const String& name,
T& variable)
{
if (!jsonValue.Contains(name))
{
return false;
}

variable = ParseValueFromJson<T>(jsonValue[name]);
return true;
}

现在我想专门针对许多不同类型的 ParseValueFromJson,其中之一是模板类 (Vector)。然而,使用典型的特化意味着 Vector 的类型参数将是未定义的:

template <>
inline Vector<T> ParseValueFromJson<Vector<T>>(const JSONValue& jsonValue)

除此之外,在函数实现中我需要 T 的类型,因为我将使用 ParseValueFromJson 的 T 类型版本来解析单个项目。

当然,如果我在特化中使用模板 T,它是一个不同的函数,会导致模棱两可的调用:

    template <typename T>
inline Vector<T> ParseValueFromJson<Vector<T>>(const JSONValue& jsonValue)

这是可能的,还是我需要解决一个单独的 TryGetContainerFromJson(或类似)函数,将模板化集合类型作为第二个模板参数?

最佳答案

我会选择一个实现 serializer 模板结构来处理序列化(并且可以很容易地部分特化),如template function specialization can be troublesome .

// Default serializer implementation.
namespace impl
{
template <typename T>
struct serializer
{
T from_json(const JSONValue& jv)
{
// default implementation...
}
};
}

// Convenient interface function.
template <class T>
inline T ParseValueFromJson(const JSONValue& jsonValue)
{
return impl::serializer<T>{}.from_json(jsonValue);
}

// "Special" serializer implementations.
namespace impl
{
template <typename T>
struct serializer<Vector<T>>
{
Vector<T> from_json(const JSONValue& jv)
{
Vector<T> result;
for(auto c : jv.children())
{
result.add(ParseValueFromJson<T>(c));
}
return result;
}
};
}

关于c++ - 模板类可以用作模板函数特化的参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37659812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com