【问题标题】:Returning a derived class of a virtual class in C++在 C++ 中返回虚拟类的派生类
【发布时间】:2014-04-09 15:20:26
【问题描述】:

这是我的问题。

我有一个带有纯虚函数 operator()() 的模板抽象类 RandomVariable

template<T> 
class RandomVariable<T> {
public:
  virtual T operator()() = 0;
  /* other stuff */
protected:
  T value;
}

我还有一个带有纯虚函数operator()()的模板抽象类Process

template<T> 
class Process<T> {
public:
  typedef std::pair<double, T> state; 
  typedef std::list<state> result_type;

  virtual result_type operator()() = 0;
  /* other stuff */
protected:
  result_type trajectory;
}

我可以轻松编写一个方法,返回生成路径并返回轨迹的最后一个值。

T GenerateTerminalValue() { 
  this->operator()();
  return value.back().second; 
};  

但是,如果不是返回类型 T,我的函数实际上返回一个函子(理想情况下从 RandomVariable 派生),其中重载的 operator() 生成路径并返回轨迹的最后一个值,那会好得多。我的最佳尝试只导致了分段错误。

有什么好的方法可以做到这一点?谢谢。

【问题讨论】:

  • “我的最佳尝试只导致了分段错误”。我正在寻找错误,但我的魔法水晶今天不太好用。

标签: c++ templates polymorphism functor


【解决方案1】:

使用std::function怎么样?

#include <functional>

template<typename T>
class MyClass {
public:
    std::function<T()> GenerateTerminalValueFunc() {
        return [this]() {
           this->operator()();
            return value.back().second;
        };
    }
    ...
};

更新:如果你想从 RandomVariable 派生,你可以尝试这样的事情:

#include <memory>

template<typename T>
class TerminalValueOp : public RandomVariable<T>
{
private:
    MyClass<T>* obj_;
public:
    TerminalValueOp(MyClass<T>* obj) : obj_(obj) {}
    T operator()() {
        obj->operator()();
        return obj->value.back().second;
    }
    ...
};

template<typename T>
class MyClass {
public:
    std::shared_ptr<RandomVariable<T>> GenerateTerminalValueOp() {
        return std::make_shared<TerminalValueOp<T>>(this);
    }
    ...
};

【讨论】:

  • 您的解决方案非常简单并且运行良好。不过有一个问题,我是 C++ 的初学者,我从未遇到过括号中的关键字 [this],它的确切含义是什么?另外,如果您真的希望返回类型从 RandomVariable 类派生,您会怎么做?
  • @YBL 您提到的[this] 只是lambda expression 的捕获子句。将this 指针添加到捕获列表基本上只是授予lambda 表达式使用它的权限。
  • @Constructor:由于 T 在 OP 的问题中被使用,我假设这个函数是模板类的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 2011-01-15
  • 2019-11-04
  • 1970-01-01
  • 2020-10-26
  • 2011-10-29
  • 1970-01-01
相关资源
最近更新 更多