繁体   English   中英

C ++模板类和返回类型作为约束

[英]C++ template class and return type as a constraint

抱歉这个愚蠢的问题,但我对C ++很陌生。

我的项目中有一个名为AlertInfoBase的基类。 它有几十个子类。 现在我想要一个类模板,它将有一个方法filter() 此方法将始终返回对AlertInfoBase的引用。 这是代码:

template <class T>
class AlertInfoFilter
{
public:
    AlertInfoFilter() { }
    AlertInfoBase & filter(T & alertInfo)
    {
        return alertInfo;
    }
};

如您所见,方法过滤器只返回传递的参数。 我的目标是使用模板专门化创建filter()替代实现,但这不是我现在的问题/问题。 我面临的一件奇怪的事情是,当我将一个类的实例传递给filter() ,它是从AlertInfoBase子类AlertInfoBase ,一切都按预期工作。 它返回相同的引用,但是当我传递一个没有实现AlertInfoBase的类的实例时,项目不会编译。 实际上这是我想要的那种行为,但有些澄清为什么会发生这种情况会很好。 编译器是否足够聪明,猜测由于返回类型,我使用不正确的参数填充方法?

谢谢

PS我正在使用MinGW编译器。

您可以将模板视为代码生成机制。 模板的特定实例化在大多数方面与手动编写的代码相同,该代码仅在适当时替换模板参数。 在您的示例中,如果使用std::string实例化AlertInfoFilter (作为不从AlertInfoBase继承的类的示例),则会生成以下代码(大约):

class AlertInfoFilter_string
{
public:
    AlertInfoFilter_string() { }
    AlertInfoBase & filter(std::string & alertInfo)
    {
        return alertInfo;
    }
};

显然,这不应该编译。

是的,编译器非常聪明,知道这一点。 当T从AlertInfoBase下降并且在其他情况下无法将T转换为返回类型时,它使用从子类到基类的隐式转换。

它也适用于在一个不相关的类中实现operator AlertInfoBase&的类,但这只会增加混乱,所以我不建议它。

filterT作为输入并将其转换为AlertInfoBase 如果T现在是一个不是AlertInfoBase子类的AlertInfoBase ,并且不提供转换,则无法编译该程序。

实际上,编译器做了接近代码的事情,用T代替实际参数并编译模板。 对于您在程序中使用的每个不同的T,这会发生一次。

当你通过例如。 一个int ,你得到:

class AlertInfoFilter
{
public:
    AlertInfoFilter() { }
    AlertInfoBase & filter(int & alertInfo)
    {
        return alertInfo;
    }
};

这显然不会编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM