小编Jef*_*eff的帖子

如何通过模板参数推导避免衰减

简化:

// 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)

c++ templates sfinae c++11

12
推荐指数
2
解决办法
579
查看次数

为什么这个dynamic_cast <T>不起作用?

这应该很简单.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)

c++ direct2d

2
推荐指数
1
解决办法
603
查看次数

标签 统计

c++ ×2

c++11 ×1

direct2d ×1

sfinae ×1

templates ×1