最終更新日時:
が更新

履歴 編集

macro
<contracts>

__cpp_lib_replaceable_contract_violation_handler(C++26)

#define __cpp_lib_replaceable_contract_violation_handler 202603L // 置き換えられる場合
#define __cpp_lib_replaceable_contract_violation_handler 0       // 置き換えられない場合

概要

契約違反ハンドラユーザー定義の関数で置き換えられるかを検出する機能テストマクロ。

契約違反ハンドラを置き換えられるかどうかは処理系定義であり、置き換えられない処理系で置き換え用の関数handle_contract_violationを宣言したプログラムは不適格となる (診断不要)。宣言が存在するだけで不適格となるため、この判定はプリプロセスの段階で行う必要がある。そのために、このマクロが用意されている。

このマクロは、契約違反ハンドラを置き換えられる場合に202603L、置き換えられない場合に0と定義される。

備考

  • このマクロは、<contracts>ヘッダと<version>ヘッダで定義される
  • 契約アサーション (prepostcontract_assert) の言語機能自体が使用できるかは、__cpp_contractsマクロで検出する

#include <contracts>
#include <iostream>

#if __cpp_lib_replaceable_contract_violation_handler
// 契約違反ハンドラを置き換えられる処理系でのみ、置き換え用の関数を定義する
void handle_contract_violation(const std::contracts::contract_violation& violation) {
  std::cout << "violated: " << violation.comment() << std::endl;
}
#endif

int main()
{
#if __cpp_lib_replaceable_contract_violation_handler
  std::cout << "replaceable" << std::endl;
#else
  std::cout << "not replaceable" << std::endl;
#endif
}

出力例

replaceable

バージョン

言語

  • C++26

処理系

関連項目

参照