处理值和指针的函数模板

时间:2012-07-12 15:50:30

标签: c++ templates pointers smart-pointers

如果我有一个功能模板,其模板参数按值或参考

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

如果我想处理指针或智能指针,那么最好首先进行derefernce,以便代码工作或编写委托函数,如

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

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