私は完璧な転送でいくつかの困難を抱えています。完璧な転送とstd :: tuple(または他のテンプレートクラス)
glue Template + rvalue reference + std :: forwardと特別な魔法のモードは、テンプレートの控除ルールが通常と同じ意味ではないが完全な転送を可能にするように作られています。例:
template <typename T>
void outer(T&& t)
{
inner(std::forward<T>(t)); // perfect forwarding activated
}
しかし、Tが実際にテンプレートクラスであれば何が起こりますか? たとえば、std :: tupleを完全に転送するにはどうすればよいですか? T & &をaboceとして使用すると、タプルに含まれるオブジェクトのすべての型情報が失われます。
次のコードは動作しないことができるしかし:
template <typename... Args>
void outer(std::tuple<Args...>&& t)
{
inner(std::forward<std::tuple<Args...>>(t));
use_args_types_for_something_else<Args...>(); // I need to have Args available
}
int main()
{
std::tuple<int, double, float> t(4, 5.0, 4.0f);
outer(t);
}
最終gccのスナップショットは言う:
error: cannot bind 'std::tuple<int, double, float> lvalue to
std::tuple<int, double, float>&&
だから明確に、私たちは左辺値を結合することができず、一般的な、非テンプレートケースに残っていますr値参照。
template <
typename... Args
template <typename...> class T
>
void outer(T<Args...>&& t)
{
inner(std::forward<T<Args...>>(t));
use_args_type_for_something_else<Args...>();
}
しかし、私はまだ同じエラーを取得:「パーフェクトforwadingモードは」だから
を起動していない私は、卑劣なこととテンプレートテンプレートとして私のタプルを渡そうとしました。
型を指定せずにstd :: forwardを呼び出すことはできません(テンプレート関数であり、控除を使用することができます)。 'std :: forward(t)' – SoapBox