レバテックLABにて情報発信とお金についての記事を書きました

levtech.jp

2023年から、私が関わっている情報発信についてスポンサー募集を開始しましたが、そのあたりの考えについて記事を書かせていただきました。

持続的な情報発信、持続的なオープンソースの開発のための取り組みとして参考になれば幸いです。

レバテックLABにて技術書以外の本を紹介する記事を書きました

levtech.jp

前編では2024年現在おすすめしたいC++書籍を紹介しました。

後編では、仕事でソフトウェア開発しながらも、余暇の時間にC++日本語リファレンスサイトや書籍の執筆、勉強会の開催などをしている立場からおすすめしたい、技術書以外の本を紹介する記事を書かせていただきました。

cpprefjp Tシャツを作ります!

github.com

2024年もCEDECでcpprefjp所属の方の発表があるので、それに合わせてcpprefjp Tシャツを作ります!

発表者だけでなく、cpprefjpのコントリビューターとスポンサーの方も、実費をいただければ発注します。

この機会に、cpprefjp Webサイトの編集に挑戦くださる方、スポンサーになってくださる方をお待ちしております。

スポンサーは、Open Collectiveで募集しています。スポンサーになっていただいた方は、1年間cpprefjp Webサイトのトップページに、ロゴ画像とリンクを掲載させていただきます。

opencollective.com

Tシャツのデザインは以下になります。次の機会はあるかどうかわからないので、この機会にぜひ!

cpprefjp Tシャツ (白)

cpprefjp Tシャツ (ブルー v2)

static_assertの比較値をエラーメッセージに表示する

C++static_assert(A == B);は表明失敗時にfalseということしかわからない場合があります。

GCC 12以上、Clang 16以上であれば、比較値をエラーメッセージに表示してくれます。

int main()
{
    constexpr int a = 1;
    constexpr int b = 2;
    static_assert(a == b);
}

GCC :

prog.cc: In function 'int main()':
prog.cc:5:21: error: static assertion failed
    5 |     static_assert(a == b);
      |                   ~~^~~~
prog.cc:5:21: note: the comparison reduces to '(1 == 2)'

Clang :

prog.cc:5:5: error: static assertion failed due to requirement 'a == b'
    static_assert(a == b);
    ^             ~~~~~~
prog.cc:5:21: note: expression evaluates to '1 == 2'
    static_assert(a == b);
                  ~~^~~~
1 error generated.

それより古いコンパイラの場合は、クラスの非型テンプレートパラメータとして左辺、右辺の値をとり、そのなかでstatic_assertすることで、エラーメッセージにテンプレートパラメータを含むクラス名が表示されるので比較値がわかるようにできます。

template <auto A, auto B>
struct static_assert_eq {
    static constexpr bool value = true;
    static_assert(A == B);
};

int main()
{
    constexpr int a = 1;
    constexpr int b = 2;
    static_assert(static_assert_eq<a, b>::value);
}

メンバ変数宣言の文脈で使うような場合に、このような2段階のstatic_assertが必要になります。

struct X {
    static constexpr int a = 1;
    static constexpr int b = 2;
    static_assert(static_assert_eq<a, b>::value); // 文脈的にstatic_assert_eq<a, b>{};はできない
};

C++日本語リファレンスcpprefjpでスポンサー募集をはじめました

cpprefjp.github.io

opencollective.com

C++日本語リファレンスを提供しているcpprefjpプロジェクトで、スポンサー募集をはじめました。

スポンサー募集のサービスとしては、Open Collectiveを使用しています。このサービスの特徴としては、手数料として10%ほど引かれますが、一般社団法人などを作らずとも団体口座をもつことができ、その口座の状況がオープンになるのでオープンソースのプロジェクトで使いやすいサービスとなっています。

私たちのWebサイトは広告をつけていないので、これまでは完全に無償で編集活動を行ってきました。しかしそれでは継続性に問題があるので、編集者に報酬を支払うことで継続的にC++の最新情報をみなさんに提供できるようにしていきます。

追記

スポンサーになっていただいた方はロゴ画像とリンクをcpprefjpのトップページに記載させていただきます。

スポンサーになっていただいた方のOpen Collectiveページに連絡先を記載いただければロゴ画像とリンクについてこちらからご連絡させていただきますが、そうでなければOpen Collectiveの問い合わせフォームからご連絡いただくようよろしくお願いします。

C++ / Boostの新たな非営利団体The C++ Alliance

Boost C++ Librariesのコンサルティング会社BoostProがなくなって以来、Boostはリーダー不在でふわふわした状態でした。

Boost.Beast作者のVinnie Falco氏が創設した新しい非営利団体The C++ Allianceでは、Boostを復権させるようBoostの基礎部分を刷新し、C++全般を支援していくことを主な目的としています。

この団体では、Boost.Asio作者のChristopher Kohlhoff氏を雇用し、フルタイムでオープンソース活動をできるようにしています。ほかにもスタッフエンジニアとして、Boostのリリースマネージャを長く続けているMarshall Clowも雇用しています。

C++23記事の訂正 : enumerateの使い方が間違っていました

2023年2月17日発売の『Software Design 2023年3月号』に書いたC++23記事で、以下のようにviews::enumerateの例を紹介していますが、

for (auto x : enumerate(v)) {
    println("{} {}", x.index, x.value);
}

xの型は実際にはtuple<difference_type, T>となる予定なので、index/valueメンバ変数はもっていませんでした。このコードは間違いでした。

基本的に構造化束縛で使うことになりそうです。

for (auto [index, value] : enumerate(v)) {
    println("{} {}", index, value);
}