gpt4 book ai didi

C++,如何使用所有类型的子集

转载 作者:IT老高 更新时间:2023-10-28 22:21:27 29 4
gpt4 key购买 nike

我正在编写一个函数,我想接受一个分布作为参数。让我们说以下内容:

#include<random>
#include<iostream>
using namespace std;

random_device rd;
mt19937 gen(rd());

void print_random(uniform_real_distribution<>& d) {
cout << d(gen);
}

现在有没有办法在 C++ 中概括此代码,简而言之,这样它就可以只接受所有分布和分布(否则编译器应该提示)? 编辑:澄清一下,解决方案还应该能够仅接受所有分布的子集(必须预先指定)。

例如,我会接受将类型定义为允许类型的集合的能力,但如果已经有一个类型具有此分布属性,那就更好了。

最佳答案

标准库中没有这样的特征。你可以写类似的东西

template<typename T>
struct is_distribution : public std::false_type {};

并专门针对每种类型,即分发

template<typename T>
struct is_distribution<std::uniform_int_distribution<T> > :
public std::true_type {};

那么就

template<typename Distr>
typename std::enable_if<is_distribution<Distr>::value>::type
print_random(Distr& d)
{
cout << d(gen);
}

此外,您可以使用类似concepts-lite 的东西(但使用decltypes,因为现在没有此功能),它在某些情况下无法工作。标准中有规则,任何分布都应遵循 (n3376 26.5.1.6/Table 118)。

template<typename D>
constexpr auto is_distribution(D& d) ->
decltype(std::declval<typename D::result_type>(),
std::declval<typename D::param_type>(),
d.reset(), d.param(), d.param(std::declval<typename D::param_type>()), true);

template<typename D>
auto print_random(D& d) -> decltype(is_distribution(d), void())
{
}

如果您只想检查该类型是否可以使用某个生成器调用,并且此调用的执行返回 result_type 您可以简化函数

template<typename D>
auto is_distribution(D& d) ->
decltype(std::is_same<typename D::result_type,
decltype(d(*static_cast<std::mt19937*>(0)))>::value);

当concepts-lite 以标准形式提供时,所有这些事情都会变得非常简单。

关于C++,如何使用所有类型的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27482972/

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