处理值和指针的函数模板

function templates dealing with values and pointers

本文关键字:函数模板 指针 处理      更新时间:2023-10-16

如果我有一个函数模板,它有一个按值或引用的模板参数,比如

template<class T> void DoSomething(T& t){ t.method();}

如果我想处理指针或智能指针,最好先取消引用,这样代码就可以工作,或者写一个像这样的委托函数

template<class T> void DoSomething(T* t){ Dosomething(*t);}

就像所有"最好吗"的问题一样,答案是"取决于"。将会有争论和意见。

但是,我建议使用第二种方法。原因是,您可以在函数的第二种形式中添加额外的检查。例如:

template<class T> void DoSomething(T* t)
{
    if (t == NULL)
        give_error_somewhere();
    else
        Dosomething(*t);
}

但正如我所说,这当然取决于你的整个项目。

这取决于您的项目。至于我,我会使用第一种变体。以下是一些原因:

  1. 若我们传递指针,我们应该记住它可以是NULL。但是,这个函数应该对所提供参数的有效性负责吗?如果函数是一个工具,那么它应该与值一起工作,参数的有效性与它无关。我想,只有当我需要明确表示函数接受值或不接受值时,我才会使用第二个变体。如果您的函数只期望值,那么为什么要给它增加额外的检查呢
  2. 您总是可以传递取消引用的指针,如果您使用任何智能指针,您不关心如果存储的指针为NULL该怎么办,因为如果您尝试取消引用NULL指针,所有标准智能指针都会抛出异常