将 return 值转换为模板类型
Cast return value to templated type
我有以下模板 class。
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));
似乎无法通过 运行 次检查来解决,因为它是一个模板 class。
不能 return "type" 作废。
我该如何解决?
您可以尝试像这样专门化模板:
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".
的大部分代码
我有以下模板 class。
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));
似乎无法通过 运行 次检查来解决,因为它是一个模板 class。 不能 return "type" 作废。 我该如何解决?
您可以尝试像这样专门化模板:
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".
的大部分代码