Bar考虑一个库的两个版本中的类:
/// v1
class Bar
{
void get_drink()
{
std::cout << "non-const get_drink() called" << std::endl;
}
};
/// v2
class Bar
{
void get_drink()
{
std::cout << "non-const get_drink() called" << std::endl;
}
void get_drink() const
{
std::cout << "const get_drink() called" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
在客户端代码中,我们拥有一个Bar对象并且想要get_drink. 我希望能够更喜欢调用 const 版本get_drink()(如果可用)(使用 v2 库时)并回退到非 const 版本(使用 v1 库时)。那是:
Bar bar;
bar.get_drink(); // this does not call the const version of v2
static_cast<const Bar&>(bar).get_drink(); // …Run Code Online (Sandbox Code Playgroud) 特别是,它必须像 NaN 一样工作std::copysign。同样,我需要一个 constexpr std::signbit。
constexpr double copysign(double mag, double sgn)
{
// how?
}
constexpr bool signbit(double arg)
{
// how?
}
// produce the two types of NaNs
constexpr double nan_pos = copysign(std::numeric_limits<double>::quiet_NaN(), +1);
constexpr double nan_neg = copysign(std::numeric_limits<double>::quiet_NaN(), -1);
// must pass the checks
static_assert(signbit(nan_pos) == false);
static_assert(signbit(nan_neg) == true);
Run Code Online (Sandbox Code Playgroud)
背后的故事是我在编译时需要两种类型的 NaN,以及区分它们的方法。我能想到的最直接的方法是操纵 NaN 的符号位。它在运行时起作用;现在我只想将一些计算移至编译时间,这是最后一个障碍。
注意:目前,我依赖 GCC,因为它有这些函数的内置版本,而且它们确实是constexpr,这很好。但我希望我的代码库能够在 Clang 上编译,或许也可以在其他编译器上编译。