役割:
エージェントの前方テンプレートパラメータのための機能、および実際の型のパラメータを維持するために、
例:
#include <iostream>
#include <functional>
void add(int& a, int&& b, int c, int *d) {
std::cout << a << std::endl;
std::cout << b << std::endl;
std::cout << c << std::endl;
std::cout << *d << std::endl;
}
void add_proxy(int &a, int &&b, int c, int *d) {
add(a, std::move(b), c, d);
}
template<typename fun, typename A, typename B, typename C, typename D>
void proxy_template(fun f, A&& a, B&& b, C&& c, D&& d) {
f(std::forward<A>(a), std::forward<B>(b), std::forward<C>(c), std::forward<D>(d));
}
int main() {
int a = 1;
add_proxy(a, 2, 3, &a);
proxy_template(add, a, 2, 3, &a);
return 0;
}
クリアな通話のadd_proxy手動プロキシタイプ
関係なく、あなたがなぜを渡すパラメータの種類の、その実際の種類に応じて転送することができ、テンプレートの種類のエージェントによって呼び出さproxy_template 4パラメータ法
std ::前方出典:
template<typename _Tp>
constexpr _Tp&&
forward(typename std::remove_reference<_Tp>::type& __t) noexcept
{ return static_cast<_Tp&&>(__t); }
前方の列だけ、他はある::タイプ&&ここで右の値にケースを転送するために渡され__t、無関係です
説明:
&&、通過引数がINT、パラメータテンプレートINT&&&(折り畳み参照)が導かれる - ので、A = INT、> INT&&A = INT&
std ::フォワード<A>() - >のstd ::フォワード<INT&>(INT&)のstd :: remove_reference <INT&> ::タイプ - > INT、上記のstd ::前方一致するソースので、
std :: remove_reference <INT&> ::タイプ& - > int型&
だから、最終的なコードは次のようになります。
constexprのINT&&&フォワード(STD :: remove_reference <INT&> ::タイプ&__t)noexcept {戻りstatic_castを<INT&&&>(__ T)}
constexprのINT&フォワード(STD :: remove_reference <INT&> ::タイプ&__t)noexcept {戻りstatic_castを<INT&>(__ T);}
、その後、左または値を左値渡しされたテンプレートに渡さ
B && B、3を通過し、bはパラメータテンプレートは非常にB = INT、B = INTこと、INT && Bを導出する&&
>のstd ::フォワード<整数> - ::フォワードは、<B>(b)にはstd 右辺値参照と呼ばれるが、彼がアクセスする能力一時変数の参照を持っているだけであることが、(INT&)(&& B = int型であるがそれ自体で、左の値として使用される場合、後続の使用、) 、
std :: remove_reference <整数> ::タイプ - > INT、上記のstd ::前方一致するソースので、
std :: remove_reference <整数> ::タイプ& - > int型&
最終的なコードは次のとおりです。
constexprのINT &&フォワード(STD :: remove_reference <整数> ::タイプ&__t)noexcept {戻りstatic_castを<整数&&>(__ T);}
テンプレートに渡されることを正しい値、または正しい値に沿ってパスです
B及びC一貫
ビューの値点として残さ全体は、それがAと一致している場合はD実際の転送は、INT *、INT *は