Namespaces
Variants

std::source_location

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変長引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap と 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通ボキャブラリ型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
struct source_location;
(C++20以上) で定義

クラス std::source_location は、ソースコードに関する特定の情報(ファイル名、行番号、関数名など)を表現します。以前は、呼び出し箇所に関するこの情報を(ログ出力、テスト、デバッグなどの目的で)取得しようとする関数は、マクロを使用して、定義済みマクロ(__LINE__ や __FILE__ など)が呼び出し元のコンテキストで展開されるようにする必要がありました。クラス std::source_location は、より良い代替手段を提供します。

std::source_location は、DefaultConstructible、CopyConstructible、CopyAssignable、Destructible、および Swappable の要件を満たします。

さらに、以下の条件が true です:

  • std::is_nothrow_move_constructible_v<std::source_location>、
  • std::is_nothrow_move_assignable_v<std::source_location>、および
  • std::is_nothrow_swappable_v<std::source_location>。

std::source_location は小さなサイズを持ち、効率的にコピーできることが意図されています。

std::source_location のコピー/ムーブコンストラクタおよびコピー/ムーブ代入演算子がトリビアルおよび/または constexpr であるかどうかは未規定です。

メンバー関数

Creation
実装定義の値で新しい source_location を構築する
(public member function)
[static]
呼び出し元の位置に対応する新しい source_location を構築する
(public static member function)
Field access
このオブジェクトが表す行番号を返す
(public member function)
このオブジェクトが表す列番号を返す
(public member function)
このオブジェクトが表すファイル名を返す
(public member function)
このオブジェクトが表す関数名を返す(存在する場合)
(public member function)

注記

機能テスト マクロ 値 標準 機能
__cpp_lib_source_location 201907L (C++20) ソースコード情報取得 ( std::source_location )

例

#include <iostream>
#include <source_location>
#include <string_view>
void log(const std::string_view message,
         const std::source_location location =
               std::source_location::current())
{
    std::clog << "file: "
              << location.file_name() << '('
              << location.line() << ':'
              << location.column() << ") `"
              << location.function_name() << "`: "
              << message << '\n';
}
template<typename T>
void fun(T x)
{
    log(x); // line 20
}
int main(int, char*[])
{
    log("Hello world!"); // line 25
    fun("Hello C++20!");
}

出力例:

file: main.cpp(25:8) `int main(int, char**)`: Hello world!
file: main.cpp(20:8) `void fun(T) [with T = const char*]`: Hello C++20!

関連項目

ソースコードの行番号と、オプションで現在のファイル名を変更する
(前処理ディレクティブ)
スタックトレース内の評価の表現
(クラス)