有一个模板参数,可以是指针类型或非指针类型

Mic*_*ael 9 c++ templates pointers c++11

假设我有类似的东西:

template <class T>
void do_something(T t){
  pass_it_somewhere(t);
  t->do_something();
}
Run Code Online (Sandbox Code Playgroud)

现在T允许是指针类型或非指针类型是有用的.函数do_something(...)基本上可以处理指针和非指针,除了t->do_something().对于指针,我需要一个->和非指针,我需要一个.访问成员.

有没有办法让T接受指针非指针?

101*_*010 11

您可以创建一个解除引用机制,如下所示:

template<typename T>
std::enable_if_t<std::is_pointer<T>::value, std::remove_pointer_t<T>&> dereference(T& t) { 
  return *t; 
}

template<typename T>
std::enable_if_t<!std::is_pointer<T>::value, T&> dereference(T& t) {
  return t;
}
Run Code Online (Sandbox Code Playgroud)

并在您的函数中使用它:

template <class T>
void do_something(T t){
  pass_it_somewhere(dereference(t));
  dereference(t).do_something();
}
Run Code Online (Sandbox Code Playgroud)

现场演示

这样你只需要使用具体版本T.


Moh*_*awi 7

灵魂1

使用模板专业化:

template <class T>
void do_something(T t){
  pass_it_somewhere(t);
  t.do_something();
}

template <class T>
void do_something(T* t){
  pass_it_somewhere(t);    
  t->do_something();
}
Run Code Online (Sandbox Code Playgroud)

解决方案2

在类T中添加用户定义的指针运算符:

class A
{
public:
    void do_something() const {}        
    const A* operator->() const { return this; }
};

template <class T>
void do_something(T t){
  pass_it_somewhere(t);      
  t->do_something();
}
Run Code Online (Sandbox Code Playgroud)

  • S /专门化/过载 (4认同)