Привести возвращаемое значение к шаблонному типу

У меня есть следующий шаблон класса.

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

Кажется, это не может быть решено проверкой во время выполнения, так как это шаблонный класс. Нельзя вернуть "тип" void. Как я могу решить это?

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 на явное значение "void", таким образом, мы можем видеть места, которые смешны или избыточны с точки зрения компилятора C++. В вашем случае это просто сигнал вызова без возврата значения. В более сложных сценариях может потребоваться перекомпоновка большей части кода в зависимости от "R".

Другие вопросы по тегам