Привести возвращаемое значение к шаблонному типу
У меня есть следующий шаблон класса.
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".