在C ++中返回虚拟类的派生类

时间:2014-04-09 15:20:27

标签: c++ templates polymorphism functor

这是我的问题。

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

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

我还有一个模板抽象类Process with pure virtual function operator()()

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()生成一个路径并返回轨迹的最后一个值,这样会好得多。我最好的尝试只会导致分段错误。

这样做的好方法是什么?感谢。

1 个答案:

答案 0 :(得分: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);
    }
    ...
};