gpt4 book ai didi

c++ - 模板参数与声明不兼容

转载 作者:行者123 更新时间:2023-12-02 15:47:00 24 4
gpt4 key购买 nike

我有一个函数可以生成随机整数或随机浮点值。为此,我想使用概念。

由于整数和 float 需要不同的分布,即 std::uniform_int_distributionstd::uniform_real_distribution,我使用单独的结构来选择正确的类型 - 也概念重载。“选择器”看起来像这样:

template<std::integral I>
struct distribution_selector {
using type = std::uniform_int_distribution<I>;
};

template<std::floating_point F>
struct distribution_selector {
using type = std::uniform_real_distribution<F>;
};

你看到我使用 using 来选择不同的类型,这取决于我使用的是整数类型还是浮点类型。

现在我的实际功能:

template<typename T = float, random_mode quality = random_mode::high_quality>
requires std::integral<T> || std::floating_point<T>
constexpr inline T rand(random& r, T min = std::numeric_limits<T>::min(), T max = std::numeric_limits<T>::max()) {
using distribution = distribution_selector<T>::type;
if constexpr(quality == random_mode::low_quality) {
return distribution<T>(min, max)(r.low_quality_engine);
} else {
return distribution<T>(min, max)(r.high_quality_engine);
}
}

demo

我收到以下错误 (msvc):

Error (active)  E3244   template constraint not satisfied   Runtime C:\...\rand.h   35      type constraint failed for "float"
atomic constraint evaluates to false
detected during instantiation of "T raid::rand(raid::random &r, T min = std::numeric_limits<T>::min(), T max = std::numeric_limits<T>::max()) [with T=float, quality=raid::random_mode::low_quality]" at line 34
Error (active)  E0519   type "distribution" may not have a template argument list   Runtime C:\...\rand.h   37      detected during instantiation of "T raid::rand(raid::random &r, T min = std::numeric_limits<T>::min(), T max = std::numeric_limits<T>::max()) [with T=float, quality=raid::random_mode::low_quality]" at line 34

我错过了什么?

最佳答案

在特化中使用概念,但不在主模板的声明中使用。此外,distribution 不是模板,其类型由其上下文决定。

template <typename T>
struct distribution_selector;

template<std::integral I>
struct distribution_selector<I> {
using type = std::uniform_int_distribution<I>;
};

template<std::floating_point F>
struct distribution_selector<F> {
using type = std::uniform_real_distribution<F>;
};

template<typename T = float, random_mode quality = random_mode::high_quality>
requires std::integral<T> || std::floating_point<T>
constexpr inline T rand(random& r, T min = std::numeric_limits<T>::min(), T max = std::numeric_limits<T>::max()) {
using distribution = distribution_selector<T>::type;
if constexpr(quality == random_mode::low_quality) {
return distribution(min, max)(r.low_quality_engine);
} else {
return distribution(min, max)(r.high_quality_engine);
}
}

Demo

关于c++ - 模板参数与声明不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73823210/

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