2

私が理解しようとしているコードでは、次のような構造が見られますref<date>(entry)。誰か、それが何を意味するのか説明してください。

entryオブジェクトへの参照を作成すると仮定しますが、date型の使用方法です。たとえば、ref<date>(entry)andref<location>(entry)は異なる値を返します。それはどのように機能しますか?

4

2 に答える 2

3

using namespace std;ヘッダーがあり、ヘッダーを含めている場合<functional>、これは関数を参照していstd::refます。

std::refstd::reference_wrapper渡すオブジェクトのラッピングを作成する関数です。要点は、テンプレート引数は推測できるため、引数を与える必要がないstd::refということです。したがって、への参照が必要な場合は、次のようにする必要があります。entry

std::ref(entry)

を作成するときに冗長な型名を入力する必要がなくなる便利な関数ですstd::reference_wrapper。手動で行う場合は、次のことを行う必要があります。

std::reference_wrapper<date>(entry)

これstd::reference_wrapperは、テンプレート クラスであり、テンプレート クラスのパラメーターをこの方法で推測できないためです。

于 2013-03-21T10:55:08.550 に答える
2

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ではなく、関数テンプレートに推測させることに注意してください。

于 2013-03-21T10:55:27.730 に答える