0

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

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

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

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

2 回答 2

0

像所有“是否最好”的问题一样,答案是“取决于”。会有争论和意见。

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

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

但就像我说的,这肯定取决于你的整个项目。

于 2012-07-12T15:56:35.960 回答
0

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

  1. 如果我们传递指针,我们应该记住它可以是 NULL。但是这个函数是否应该对所提供参数的有效性负责?如果函数是一个工具,它应该与值一起工作,参数的有效性不是它关心的问题。我认为只有当我需要明确地说该函数接受值或不接受时,我才会使用第二个变体。如果你的函数只需要值,那么你为什么要给它额外的检查呢?
  2. 您始终可以传递取消引用的指针,并且如果您使用任何智能指针,您不必关心存储的指针是否为 NULL,因为如果您尝试取消引用 NULL 指针,所有标准智能指针都会抛出异常。
于 2012-07-12T18:02:17.333 回答