【发布时间】:2018-02-14 12:50:27
【问题描述】:
我有以下模板类。
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 f()并且你从一个返回void的函数中调用它,return f()是合法的并且定义明确的。这是针对这样的通用代码:您不必为返回void的函数提供单独的特化。 -
@PeteBecker,好的,它应该可以工作吗?但事实并非如此。如果我在这里阅读 boost 手册 link 似乎 signal_(argument) 返回一个 boost::optional
并且我应该在取消引用它时获得该值。 -
这似乎是一个需要通过专业化来解决的问题。 C++ 是否允许您只专门化类模板的一种方法?
-
@melpomene 我理解你是否正确,你会建议我创建一个模板
类 Event 派生自 public Event ?我已经尝试过了,但我不知道如何强制在 Event 类上使用该专用类。如果可能的话,我认为这可能是一个解决方案,但我不知道该怎么做。 -
@melpomene:不,C++ 不允许您专门化成员函数:stackoverflow.com/questions/15374841/…
标签: c++ c++11 templates casting boost-signals2