如何在c ++中检查模板类中的类型?

问题描述 投票:0回答:2

我有一个可以显示图像或一行文本的Button类,我正在尝试使用模板工具。

如果是文本,则模板类型为:const char *

如果是图像,则模板类型为:const wchar_t *

这里是需要区分两种类型的方法:

template <typename T>
void Button<T>::draw(EasyGraphics* canvas)
{
    canvas->setBackColour(colour);

    if (mouseOver)
    {
        canvas->setPenColour(EasyGraphics::BLACK, 4);
    }
    else
    {
        canvas->setPenColour(EasyGraphics::BLACK, 2);
    }

    canvas->drawRectangle(Entity::GetX(), Entity::GetY(), Entity::getWidth(), Entity::getHeight(), true);
    canvas->setFont(20, L"");
    canvas->setTextColour(textColour);

    switch (typeid(T))
    {
        // Button has display text
        case typeid(const char*):
        {
            canvas->drawText(displayData, Entity::GetX() + textXOfset, Entity::GetY() + (Entity::getHeight() / 4) - 3);
            break;
        }
        // Button has display image
        case typeid(const wchar_t*):
        {
            canvas->drawBitmap(displayData, Entity::GetX() + textXOfset, Entity::GetY() + (Entity::getHeight() / 4) - 3, 60, 60, 0x0000FF00);
            break;
        }
    }
}

我似乎无法使开关位于底部以正常工作。我不确定切换是否是解决该问题的最佳方法。任何建议将不胜感激,欢呼。

c++ templates types switch-statement typechecking
2个回答
3
投票

使用类型特征(和if constexpr)代替typeid。例如:

void g_char(const char*);
void g_wchar_t(const wchar_t*);

template <typename T>
void f(T)
{
    if constexpr (std::is_same_v<T, const char*>)
    {
        g_char(T());
    }
    else if constexpr (std::is_same_v<T, const wchar_t*>)
    {
        g_wchar_t(T());
    }
}

http://coliru.stacked-crooked.com/a/08e9e66ed5c776a4

这里的开关不起作用的原因是该条件必须隐式转换为整数类型,而std::type_infotypeid返回的内容则不是)。>>

但是如果您尝试保留typeid表达式,则在尝试调用drawTextdrawBitmap时会遇到编译时类型检查的问题。除非您使用constexpr分支(if constexpr),否则两个调用都必须有效。但是,条件必须是编译时常量,其中不能使用typeid。因此,可以改用类型特征,尤其是std::is_same


0
投票

进行模板专业化:

© www.soinside.com 2019 - 2024. All rights reserved.