2411C++,学习C++提示4

结构绑定

cpp 复制代码
  auto [first, ...ts] = std::tuple{1, 2 ,3};
  assert(1 == first);

浮点作为非类型模板参数

cpp 复制代码
template<double Value> constexpr auto value = Value;

int main() {
    std::cout << value<4.2>; // prints 4.2
}
cpp 复制代码
template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>) {
    constexpr auto mul = (Vl2s * ...);
    return ((Vl1s * mul) + ...);
}
cpp 复制代码
template <double... List1, double... List2>
[[nodiscard]] consteval auto calc(values<List1...>, values<List2...>) {
    return (0 + ... + (List1 * (1 * ... * List2)));
}
cpp 复制代码
template<double... Values> struct values {};

template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>) {
    return ((Vl1s * (Vl2s * ...)) + ...);
}

template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
    return std::fabs(a - b) < Epsilon;
}
cpp 复制代码
template<double... Values> struct values {};

template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>) {
    constexpr auto c = (Vl2s * ...);
    return ((Vl1s * c) + ...);
}

template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
    return std::fabs(a - b) < Epsilon;
}
cpp 复制代码
template<double... Values> struct values {};

template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>) {
  return (Vl1s + ...) * (Vl2s * ...);
}

template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
    return std::fabs(a - b) < Epsilon;
}
cpp 复制代码
template<double... Values> struct values{};

template<double Vl1, double... Vl2s>
[[nodiscard]] consteval auto mult(){
  return  (Vl1 * ... * Vl2s);
}

template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>){
  return (... + mult<Vl1s, Vl2s...>());
}

template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
    return std::fabs(a - b) < Epsilon;
}
cpp 复制代码
template<double... Values> struct values {};

template<double... Vl1s, double... Vl2s>
[[nodiscard]] consteval auto calc(values<Vl1s...>, values<Vl2s...>){
    return (0.0 + ... + (Vl1s * (Vl2s * ... )));
}

template<double Epsilon = 0.1>
[[nodiscard]] consteval auto eq(double a, double b) {
    return std::fabs(a - b) < Epsilon;
}

不可达

cpp 复制代码
#include <utility>

int main() {
    std::unreachable();
    return 42; // invokes undefined behavior
}

抑制ADL

cpp 复制代码
namespace adl {
    struct foo {};
    void bar(foo) {}
}

int main() {
    adl::foo foo;
    bar(foo);   // OK,    ADL
    (bar)(foo); // error: no ADL
}

交换字节

cpp 复制代码
#include <bit>

int main() {
   constexpr auto value = std::uint16_t(0xCAFE);
   std::cout << std::hex << value; // pritns cafe
   std::cout << std::hex << std::byteswap(value); // prints feca
}

行多态

cpp 复制代码
struct foo {
  int a{};
  int b{};
};

struct bar {
  int a{};
};

struct missing_a {
  int b{};
};

struct row_with_member_a {
  constexpr explicit(false) row_with_member_a(const auto& t)
    : a{t.a}
  { }

  int a{};
};

auto shrink(row_with_member_a r) {
  std::cout << r.a;
}

int main() {
  //shrink(missing_a{.b = 42}); // error
  shrink(foo{.a = 4, .b = 2}); // prints 4
  shrink(bar{.a = 42}); // prints 42
}

多维数组

cpp 复制代码
template <class T, auto Dimensions> class mdarray2 {
public:
  template <class I1, class I2> constexpr T &operator[](I1 i1, I2 i2) {
    return vs_[i1][i2];
  }

private:
  std::array<std::array<T, 2>, Dimensions> vs_{};
};

int main() {
  mdarray2<int, 2> a{};
  a[1, 1] = 42;
  assert(0 == (a[0, 0]));
  assert(42 == (a[1, 1]));
}

基于策略的设计

cpp 复制代码
template<class TPolicy>
struct foo : TPolicy {
  static constexpr auto bar() {
    return TPolicy::bar();
  }
};

template<auto N>
struct policy { static constexpr auto bar() { return N; } };

static_assert(0 == foo<policy<0>>::bar());
static_assert(42 == foo<policy<42>>::bar());
相关推荐
夜不会漫长4 小时前
C++入门(1)
开发语言·c++·算法
旖旎夜光5 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
..Dauntless..5 小时前
【C++】继承——基类和派生类的配合
开发语言·c++·算法
程与留6 小时前
05_Qt 核心模块概览——Qt Core、Gui、Widgets、Quick 的职责划分
c++·qt
buhuizhiyuci6 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
冻柠檬飞冰走茶10 小时前
《数据结构实验指导-C++语言版》 求单链表list中的元素个数,即表长
开发语言·数据结构·c++·算法·list
_Narcissus_10 小时前
动态规划初探(含完整代码实现)
c语言·数据结构·c++·算法·动态规划·背包问题·最短路径
法哥201211 小时前
用 C++ 控制 CMW100,到底在干什么?
开发语言·c++
_Narcissus_12 小时前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举
冻柠檬飞冰走茶12 小时前
《数据结构实验指导-C++语言版》 在顺序表 list 中查找元素 x
开发语言·数据结构·c++·算法·list