将返回值转换为模板化类型

时间:2018-02-14 12:50:27

标签: c++ c++11 templates casting boost-signals2

我有以下模板类。

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));   

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

1 个答案:

答案 0 :(得分: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_;

   ...    
};

所以,我们用显式替换了R&#34; void&#34;因此,从C ++编译器的角度来看,我们可以看到荒谬或冗余的地方。在您的情况下,它只是一个信号调用而不返回值。在更复杂的场景中,您可能需要重新构建依赖于&#34; R&#34;的更大部分代码。