小编Han*_*ank的帖子

如何更喜欢调用 const 成员函数并回退到非 const 版本?

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)

c++ templates member-functions

7
推荐指数
1
解决办法
154
查看次数

如何编写可移植的 constexpr std::copysign()?

特别是,它必须像 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 上编译,或许也可以在其他编译器上编译。

c++ math nan constexpr

5
推荐指数
1
解决办法
348
查看次数

标签 统计

c++ ×2

constexpr ×1

math ×1

member-functions ×1

nan ×1

templates ×1