Boost:取消引用模板参数,如果它是指针

时间:2011-06-15 07:43:06

标签: c++ templates

如果模板参数是指针(或智能指针),我可以使用什么来取消引用模板参数,如果不是,则可以将其保留原样?

template<class T> void subf(const T& item)
{
    item.foo();
}

template<class T> void f(const T& item)
{
    subf(magic_dereference_function(item));
}

Boost中的任何内容都是一种选择。

4 个答案:

答案 0 :(得分:11)

template <typename T>
T& maybe_deref(T& x) { return x; }

template <typename T>
T& maybe_deref(T* x) { return *x; }

您必须单独为智能指针添加重载。没有办法检测一个类是否是“智能指针”。你可以检测到operator->的存在,但这并不意味着它是一个智能指针。

答案 1 :(得分:3)

过载怎么样?

template<class T>
T& deref(T& t){
  return t;
}

template<class T>
T& deref(T*& t){
  return *t;
}

答案 2 :(得分:1)

答案 3 :(得分:0)

我不知道这是否适合你的模式,但对于成员函数引用,boost :: bind和boost :: phoenix已经做了你想做的事情:

 struct T 
 {
      void f(int) const {} 
 };


 T instance;
 T* pointer = new T();
 boost::shared_ptr<T> shared(new T());

 boost::bind( & T:f, instance, 1);              // stores instance by value
 boost::bind( & T:f, boost::ref(instance), 2);  // stores instance by ref
 boost::bind( & T:f, boost::cref(instance), 3); // stores instance by const ref

 boost::bind( & T:f, pointer, 4);               // dereferences the pointer

 boost::bind( & T:f, shared, 5);                // dereferences the smart pointer

_你甚至可以使用typetraits让boost :: bind / phoenix了解你自己的智能指针(或任何你想要使用operator *和operator-&gt;取消引用的类型)_ < / p>