gpt4 book ai didi

c++ - 如果 constexpr 具有尽可能短的代码,我该如何向后移植?

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:16 25 4
gpt4 key购买 nike

我正在使用这段代码来实现类似于 C# 中的类型查询:

template<class T>
constexpr bool IsSixtyFourBit() {
return is_same<T, int64_t>() || is_same<T, uint64_t>();
}

template<class T>
constexpr bool IsDouble() {
return is_same<T, double>() || is_same<T, double_t>();
}

template<class T>
constexpr bool IsFloat() {
return is_same<T, float>() || is_same<T, float_t>();
}


template<class T>
constexpr bool IsReal() {
return IsDouble<T>() || IsFloat<T>();
}

template <class T>
constexpr T MakePseudoNumberGenerator(T min, T max) {
if constexpr (IsSixtyFourBit<T>()) {
mt19937_64 rng(random_device{}()); // random-number engine used (Mersenne-Twister in this case)
uniform_int_distribution<T> uni(min, max); // guaranteed unbiased

return uni(rng);
} else if constexpr (IsReal<T>()) {
mt19937_64 rng(random_device{}()); // random-number engine used (Mersenne-Twister in this case)
uniform_real_distribution<T> uni(min, max); // guaranteed unbiased

return uni(rng);
} else {
mt19937 rng(random_device{}()); // random-number engine used (Mersenne-Twister in this case)
uniform_int_distribution<T> uni(min, max); // guaranteed unbiased

return uni(rng);
}
}

但我无法弄清楚如何使用最少的代码在 C++17 下为 C++ 环境重写它......部分特化应该在这里工作,但它并不实用......

完整代码:https://godbolt.org/g/QBs92V

最佳答案

在我看来,模拟 if constexpr 需要最少的额外机制和语法更改的方法是使用 std::tuple。一般的做法是翻译代码

if constexpr (P) {
T;
} else {
F;
}

调用封装 true 和 false 分支的两个多态 lambda 之一:

std::get<P ? 0 : 1>(std::forward_as_tuple(
[&](auto) { T; },
[&](auto) { F; }))(0);

这允许使谓词和两个分支保持相同的顺序和相同的封闭范围;事实上,可以将仿真代码放入宏中检查 __cplusplus 版本,同时保持业务逻辑不变。

由于 lambda 是多态的,它们将被检查语法正确性,并且只会在 P 被评估后被实例化。

例如,在您的情况下:

template <class T>
constexpr T MakePseudoNumberGenerator(T min, T max) {
return std::get<IsSixtyFourBit<T>() ? 0 : 1>(std::forward_as_tuple(
[&](auto) {
mt19937_64 rng(random_device{}()); // random-number engine used (Mersenne-Twister in this case)
uniform_int_distribution<T> uni(min, max); // guaranteed unbiased

return uni(rng);
}, std::get<IsReal<T>() ? 0 : 1>(std::forward_as_tuple(
[&](auto) {
mt19937_64 rng(random_device{}()); // random-number engine used (Mersenne-Twister in this case)
uniform_real_distribution<T> uni(min, max); // guaranteed unbiased

return uni(rng);
},
[&](auto) {
mt19937 rng(random_device{}()); // random-number engine used (Mersenne-Twister in this case)
uniform_int_distribution<T> uni(min, max); // guaranteed unbiased

return uni(rng);
}))))(0);
}

关于c++ - 如果 constexpr 具有尽可能短的代码,我该如何向后移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45586847/

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