【发布时间】:2016-01-01 17:51:58
【问题描述】:
我对 c++ 模板编程领域还很陌生。
我知道我可以专门化函数模板,例如在我的情况下,我想使用 ADL 使用 toJson-function 模板。
例如
template<typename T>
Json::Value toJson(const T&);
其中 Json::Value 由 JsonCPP-Library 提供。
现在我可以将它专门用于像这样的“正常”类型:
template<>
Json::Value toJson<MyClass>(const MyClass&)
太棒了。
但是,我有一个类型,KalmanFilter<3, 3, 3, double>(显然,这是完全参数化的),它又具有几个 Eigen3-Matrices 作为类型,其维度是根据 KalmanFilter 中的积分模板参数确定的。我想像这样专注于 toJson:
template<>
Json::Value toJson<KalmanFilter<int, int, int, T>>(const KalmanFilter<int, int, int, T> ...)
也许有一种不同的方式来实现这一点(例如,Eigen 重载了 std::ostream 运算符
或者我必须使用不同声明的 toJson,比如
template<int A, int B, int C, typename FloatT>
Json::Value toJson(const KalmanFilter<A, B, C, FloatT>&);
?
【问题讨论】:
-
也许将 toJson 方法的一部分包含在您需要专门化的类型中?
-
是的,你需要使用不同声明的 toJson,这相当于重载它(这是优越的,除非 toJson 像
toJson<T>这样使用会破坏它)。 -
这只对第一个“层”有帮助,卡尔曼滤波器(它会很丑,因为它会相当侵入......但我可以忍受它)。但是,
Eigen3::Matrix<...>types 的 toJson 仍然会丢失。 -
@JohannesSchaub-litb 我不完全理解您的评论 - 在这种情况下,优越是什么意思,
toJson<T>是什么意思可能会破坏它?我不是要为 toJson提供默认实现,因为它会捕获所有其他实例化吗?我完全可以忍受。 -
@deets 重载是优越的,因为你的用例可以通过它来实现,而不能通过专业化(那里没有参数化可能)。
toJson<T>(x)将中断,因为您的重载需要int A而不是类型T作为模板参数。然而,通过显式模板参数调用用户可自定义的函数是不好的风格,所以我猜他们不会那样做。如果您自己调用它,无论如何都不是问题。