gpt4 book ai didi

c++ - C++中作为类成员的分布

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:44 25 4
gpt4 key购买 nike

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

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

    class Foo{
    private:
    // could by any distribution
    std::base_distribution dist_;

    };
  2. 我还有一个类(class)Bar应该有一个 vector Foo作为私有(private)成员 ( std::vector<Foo> )。问题是如果Foo使用模板,那么不可能有一个由不同模板参数组成的 vector ,而这正是我想要的。

    class Bar {
    private:
    std::vector<Foo> foo_;

    };

boost::variant也无济于事,因为我不知道发行版的类型。所以这(例如)在我的情况下是不可能的:

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

最佳答案

不,没有所有分布模板共享的基类。即使有,您的预期方法也不会奏效 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...> {};

...等等,对于你想要支持的任何发行版。您可能还需要将包装器的构造函数委托(delegate)给它们真正的分发基类,以实现最大透明度。

在这一点上,对象切片成为一个因素,因此您不能只是将 base_distribution 作为成员插入类中,或将其插入 vector 中,并期望它起作用。你必须至少使用一个

std::shared_ptr<base_distribution>

作为类成员,或容器值。在这一点上,总结一下,在您的 base_distribution 类中定义您需要的任何虚拟方法,并在模板子类中适本地实现它们。

关于c++ - C++中作为类成员的分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42203627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com