私が理解しようとしているコードでは、次のような構造が見られますref<date>(entry)
。誰か、それが何を意味するのか説明してください。
entry
オブジェクトへの参照を作成すると仮定しますが、date
型の使用方法です。たとえば、ref<date>(entry)
andref<location>(entry)
は異なる値を返します。それはどのように機能しますか?
using namespace std;
ヘッダーがあり、ヘッダーを含めている場合<functional>
、これは関数を参照していstd::ref
ます。
std::ref
std::reference_wrapper
渡すオブジェクトのラッピングを作成する関数です。要点は、テンプレート引数は推測できるため、引数を与える必要がないstd::ref
ということです。したがって、への参照が必要な場合は、次のようにする必要があります。entry
std::ref(entry)
を作成するときに冗長な型名を入力する必要がなくなる便利な関数ですstd::reference_wrapper
。手動で行う場合は、次のことを行う必要があります。
std::reference_wrapper<date>(entry)
これstd::reference_wrapper
は、テンプレート クラスであり、テンプレート クラスのパラメーターをこの方法で推測できないためです。
std::ref
関数テンプレートはstd::reference_wrapper
、特定のオブジェクトの を作成するために使用されます。これにより、関数テンプレートが対応する引数を値で受け取る場合でも、参照によって関数テンプレートにオブジェクトを渡すことができます。
例えば:
template<typename T>
void foo(T t)
{
t = 42;
}
int x = 0;
foo(std::ref(x));
std::cout << x; // Will print 42
foo()
上記の関数は非常にばかげた関数であり、説明のために書いたにすぎないことに注意してください。多くの場合、std::ref
またはstd::cref
と組み合わせて使用さstd::bind
れます。デフォルトでは、指定した引数のコピーが作成されます。
template<typename T>
void bar(T v1, T& v2)
// ^
// Second argument accepted by reference this time...
{
v2 = v1 + 42;
}
int x = 0;
auto f = std::bind(bar, 0, ref(x));
// ^^^
// ...but without this, a copy of x would be created!
f(x);
std::cout << x; // Will print 42
std::ref
また、通常はorのテンプレート引数を明示的に指定するのstd::cref
ではなく、関数テンプレートに推測させることに注意してください。