作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用这段代码来实现类似于 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++ 环境重写它......部分特化应该在这里工作,但它并不实用......
最佳答案
在我看来,模拟 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/
我知道在 KDB 中,如果您有一个列表,例如... l:`apples`oranges`pears` 您可以像下面这样进行 N 次随机选择: 9?l 但是如何尽可能均匀地选择列表中的每个项目? 最佳答
我真的厌倦了它。我有一个高级 Web 应用程序依赖于大量 Javascript 库(jQuery、jQueryUI、OpenLayers、highcharts、EJSChart 等等)。不用说,Int
我是一名优秀的程序员,十分优秀!