0

我有以下模板类。

template<typename T, typename R = void> 
class Event 
{ 
 public:  
  typedef boost::signals2::signal<R (const T&)> signal_t;

  virtual R fire(const T& argument)   
  {
    return static_cast<R>(*signal_(argument));   
  }    

private:
  signal_t signal_;

   ...    
};

由于 R 可以是无效的,我在线得到一个无效的间接编译错误

return static_cast<R>(*signal_(argument));   

它似乎无法通过运行时检查来解决,因为它是一个模板类。不能返回“类型”无效。我该如何解决这个问题?

4

1 回答 1

1

您可以尝试像这样专门化模板:

template<typename T>
class Event<T,void>
{
  typedef boost::signals2::signal<void (const T&)> signal_t;
  virtual void fire(const T& argument)   
  {
    signal_(argument);   
  }    
private:
  signal_t signal_;

   ...    
};

因此,我们用显式的“void”值替换了 R,因此我们可以从 C++ 编译器的角度看到荒谬或多余的地方。在您的情况下,这只是一个没有返回值的信号调用。在更复杂的场景中,您可能需要重新编写依赖于“R”的大部分代码。

于 2018-02-14T17:00:43.500 回答