简化:
// CHAR_TYPE == char, wchar_t, ...
template <typename CHAR_TYPE, unsigned CHAR_COUNT>
void Foo(CHAR_TYPE const (&value)[CHAR_COUNT]) noexcept
{
TRACE("const ref array");
// perform a bit of logic and forward...
}
template <typename CHAR_TYPE>
void Foo(CHAR_TYPE const* value) noexcept
{
TRACE("const ptr");
// perform a bit of logic and forward...
}
// [ several other overloads ]
Run Code Online (Sandbox Code Playgroud)
调用点:
char const* ptr = ...
wchar_t const* wptr = ...
Foo(ptr); // <-- good: "const ptr"
Foo(wptr); // <-- good: "const ptr"
constexpr …
Run Code Online (Sandbox Code Playgroud) 这应该很简单.ID2D1LinearGradientBrush使用有效的vtable从ID2D1Brush派生.我意识到QueryInterface可以在这里工作,但我的问题与dynamic_cast有关.
[definition from d2d1.h]
interface DX_DECLARE_INTERFACE("2cd906ab-12e2-11dc-9fed-001143a055f9")
ID2D1LinearGradientBrush : public ID2D1Brush
{
// ....
}
Run Code Online (Sandbox Code Playgroud)
但是,鉴于过度简化的示例函数......
bool ClampToItem(ID2D1Brush *brush, SizeF itemSize)
{
// As expected, works when a linear gradient brush is the parameter.
ID2D1LinearGradientBrush *linearGradientBrush = static_cast<ID2D1LinearGradientBrush *>(brush);
linearGradientBrush->SetStartPoint(D2D1_POINT_2F{ itemSize.Width, 0.0f });
linearGradientBrush->SetEndPoint(D2D1_POINT_2F{ itemSize.Width, itemSize.Height });
return true;
}
bool ClampToItem2(ID2D1Brush *brush, SizeF itemSize)
{
// this dynamic cast FAILS EVERY TIME with an access violation
ID2D1LinearGradientBrush *linearGradientBrush = dynamic_cast<ID2D1LinearGradientBrush *>(brush);
if (!linearGradientBrush) // <-- never gets here
return false; …
Run Code Online (Sandbox Code Playgroud)