如果模板参数是指针(或智能指针),我可以使用什么来取消引用模板参数,如果不是,则可以将其保留原样?
template<class T> void subf(const T& item)
{
item.foo();
}
template<class T> void f(const T& item)
{
subf(magic_dereference_function(item));
}
Boost中的任何内容都是一种选择。
答案 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>