【问题标题】:Cast return value to templated type将返回值转换为模板类型
【发布时间】: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


【解决方案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”的大部分代码。

【讨论】:

猜你喜欢
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 2016-10-21
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多