我想使用来自:
https://google.github.io/googletest/reference/matchers.html#pointer-matchers的
WhenDynamicCastTo<T>(m)
但是我想要动态转换的是
shared_ptr
并且 WhenDynamicCastTo
不适用于智能指针。
我尝试制作自己的与智能指针一起使用的版本,但我不确定如何制作模板化匹配器,我尝试了这个,但它不起作用:
template <typename To>
MATCHER_P(WhenDynamicPointerCastTo<To>, matcher, "")
{
// Use std::dynamic_pointer_cast here
}
这样做确实有效,但我想将其隐藏在单个匹配器后面:
template <typename To>
std::shared_ptr<const To> dynamic_smart_pointer_cast(
const std::shared_ptr<const parent>& p)
{
return std::dynamic_pointer_cast<const To>(p);
}
EXPECT_CALL(*mock_, func(
::testing::ResultOf(
dynamic_smart_pointer_cast<child>,
::testing::Pointee(...))));
以下内容基于
WhenDynamicCastTo
在 gmock 源代码中的工作方式(未经测试),一些结果打印已被删除,因为它使用 gmock 的 internal
命名空间中的帮助程序。
template <typename To>
class WhenDynamicPointerCastToMatcher {
public:
explicit WhenDynamicPointerCastToMatcher(const Matcher<To>& matcher)
: matcher_(matcher) {}
void DescribeTo(::std::ostream* os) const {
GetCastTypeDescription(os);
matcher_.DescribeTo(os);
}
void DescribeNegationTo(::std::ostream* os) const {
GetCastTypeDescription(os);
matcher_.DescribeNegationTo(os);
}
template <typename From>
bool MatchAndExplain(From from, MatchResultListener* listener) const {
To to = std::dynamic_pointer_cast<To>(from);
// TODO: describe failures to the listener
return matcher_.Matches(to);
}
private:
static void GetCastTypeDescription(::std::ostream* os) {
*os << "when dynamic_pointer_cast, ";
}
const Matcher<To> matcher_;
};
template <typename To>
inline PolymorphicMatcher<WhenDynamicPointerCastToMatcher<To>>
WhenDynamicPointerCastTo(const Matcher<To>& inner_matcher) {
return MakePolymorphicMatcher(
WhenDynamicPointerCastToMatcher<To>(inner_matcher));
}