在C ++中作为类的成员分发

时间:2017-02-13 12:05:32

标签: c++ class c++11 boost distribution

我有两个关于在课堂内使用分布的相关问题。

  1. 在C ++中是否存在某种基本分布,以便将分布用作类成员而不知道它将是哪个分布?我不能使用模板(见问题2)

    class Foo{
        private:
            // could by any distribution
            std::base_distribution dist_;
    
    };
    
  2. 我还有另一个类Bar,它应该有一个Foo向量作为私有成员(std::vector<Foo>)。问题是如果Foo使用模板,那么就不可能有一个不同模板参数的向量,这正是我想要的。

    class Bar {
        private:
            std::vector<Foo> foo_;
    
    };
    
  3. boost::variant也没有帮助,因为我不知道发行版的类型。所以这(例如)在我的情况下是不可能的:

    class Bar{
        private:
            boost::variant<std::normal_distribution<>, std::uniform_real_distribution<> > dists_;
    };
    

2 个答案:

答案 0 :(得分:8)

不,所有分发模板都没有共享基类。即使有,你的预期方法仍然无法正常工作because of object slicing

但是,创建自己的基类并从中派生它应该相当容易。

class base_distribution {};

template<typename ...Args> class normal_distribution :
public base_distribution, public std::normal_distribution<Args...> {};

template<typename ...Args> class uniform_int_distribution :
public base_distribution, public std::inform_int_distribution<Args...> {};

...依此类推,无论您想支持哪种发行版。您可能还需要委托包装器&#39;构造函数到它们的实际分布基类,以获得最大的透明度。

此时,对象切片成为一个因素,因此您不能将base_distribution作为成员推送到类中,或将其推入向量中,并期望它能够正常工作。你必须至少使用

std::shared_ptr<base_distribution>

作为类成员或容器值。此时,要将其包装起来,请在base_distribution类中定义所需的任何虚拟方法,并在模板子类中相应地实现它们。

答案 1 :(得分:1)

据我所知,没有&#34;基础分发类&#34;或C ++中的通用分发类。你确实有RandomNumberDistribution concept,但这显然不是一回事。

如果你想要一个快速和肮脏的发行版(我的意思是脏),我目前使用类似的东西(.h.cpp)。

关于你的第二个问题 - 你可能需要让你的模板类继承自你可以放在向量中的一个非模板化的类(你需要使用指针成员,以避免数据切片)