C++17 存在一个不起眼的类型 std::monostate,引入背景是 std::variant 需要允许默认构造,而如果它所有的候选类型都不支持默认构造,那就可以将 std::monostate 作为第一个候选类型来避免无效状态。 一个小例子: struct S { explicit S(int) {} }; // Error: the first alternative is not default constructible. std::variant<S> v; // OK std::variant<std::monostate, S> w; 因此,std::monostate 也被放到了 <variant>,定义很简单: struct monostate {}; 许多人容易把它当成是一个“空”类型,但从严格意义上来讲,它同 void 一样,是一个单值类型。… Continue Reading

Introduction 程序设计需要不断地做抉择,抉择便需用到逻辑分派。 Modern C++ 中,有多种方式完成这个任务,例如 Run-time if,Tag dispatching,SFINAE,Partial Specialization 等等。这些方式分为运行期分派和编译期分派,分派的条件称为约束。设计是为了厉行约束,理想上,能在编译期强制表现的约束就应提升到编译期完成。 C++17 又增加了一种编译期方式 Compile-time if;C++20 中,又增加了 Concepts。 本篇就来总结一下各种方式的用法异同(Concepts见下篇)。 Run-time if 运行期 if 就是运行时期才会执行的分支语句,例如: template <typename T> void foo(const T& val) { if(std::is_integral<T>::value) { std::cout << "integral\n"; } else { std::cout <<… Continue Reading