std::tuple
에 함수를 적용하는 함수를 작성했습니다 (기반은 "unpacking" a tuple to call a matching function pointer). 튜플이 복사 될 우려가 있습니다. 나는 동작 의미론이 무엇을하는지에 대한 아주 기본적인 생각을 가지고 있으며, 일반적으로 발견되는 문자열 예제에서 & & 및 rvalue와 같은 개념을 이해합니다. 그러나 나는 std :: forward()와 같은 것들이 어떻게 작동하는지에 대해 많이 모른다. 그리고 포장 및 variadic 프로그래밍이있을 때 어떻게 처리해야할지 모르겠습니다. (나는 약간의 표준을 추가했다 :: forward와 & &의 주위에 그리고 곧 컴파일 오류를 얻는다.)다음 코드에서 std :: tuple이 C++ 11 시맨틱을 사용하는지 확인하십시오.
사람은 튜플을위한 움직이는 의미가 작동하게하는 방법을 여기에서 설명 할 수 있냐? 한 가지 추가 질문은 코드의 튜플에 실제로 움직이는 의미가 실제로 작동하는지 (시각적 인 코드 검사 제외) 어떻게 확인할 수 있습니까?
미리 감사드립니다.
#include <tuple>
#include <iostream>
#include <functional>
template<int ...> struct seq {};
template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {};
template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };
template <typename R, typename Tp, typename ...FArgs>
struct t_app_aux {
template<int ...S>
R static callFunc(std::function<R (FArgs...)> f,Tp t,seq<S...>) {
return f(std::get<S>(t) ...);
}
};
template <typename R, typename Tp, typename ...FArgs>
R t_app(std::function<R (FArgs...)> f, Tp t) {
static_assert(std::tuple_size<Tp>::value == sizeof...(FArgs), "type error: t_app wrong arity");
return t_app_aux<R, Tp, FArgs...>::callFunc(f,t,typename gens<sizeof...(FArgs)>::type());
}
int main(void)
{
std::tuple<int, float, double> t = std::make_tuple(1, 1.2, 5);
std::function<double (int,float,double)> foo1 = [](int x, float y, double z) {
return x + y + z;
};
std::cout << t_app(foo1,t) << std::endl;
}
리소스가없는 기본 유형 (int, double, std :: array 등)을 사용할 때 move가 copy와 동일하다는 것을 알고 있습니까? 따라서이 특정 코드 스 니펫에는 이동이 불가능합니다. – Mikhail