유형이 있습니다. 해당 목록의 각 유형에 함수를 호출 한 결과와 함께 튜플을 작성한 다음이를 다른 함수에 인수로 사용하고 싶습니다. 이 같은 뭔가 :런타임시 기능이있는 유형 목록 작성
template<typename F>
struct function_traits;
template<typename T, typename R, typename... Args>
struct function_traits<R(T::*)(Args...) const> {
using return_type = R;
using param_types = std::tuple<Args...>;
};
template<typename T> struct function_traits : public
function_traits<decltype(&T::operator())> {};
template <typename T>
T* get_arg(int id)
{
// Actual implementation omitted. Uses the id parameter to
// do a lookup into a table and return an existing instance
// of type T.
return new T();
}
template <typename Func>
void call_func(Func&& func, int id)
{
using param_types = function_traits<Func>::param_types>;
func(*get_arg<param_types>(id)...); // <--- Problem is this line
}
call_func([](int& a, char& b) { }, 3);
문제는 func(*get_arg<param_types>(id)...);
실제로 param_types 때문에 컴파일되지 않는다는 것입니다 튜플이 아닌 매개 변수 팩입니다. 컴파일러에서 "확장 할 수있는 매개 변수 팩이 없습니다"라는 오류가 발생합니다. 내가 겪었 으면 좋겠던 점은 그 라인이 다음으로 확장되는 것입니다 :
func(*get_arg<int>(id), *get_arg<char>(id));
그리고 임의의 수의 인수에 대해 작업 할 수 있습니다. 그 결과를 얻을 수있는 방법이 있습니까?
이 질문은 유사하지만 자체적으로 제 문제를 해결하지는 않습니다 : "unpacking" a tuple to call a matching function pointer. 형식 목록이 있고 거기에서 함수 인수로 사용할 값 목록을 생성하려고합니다. 내가 값의 목록을 가지고 있다면 그것들을 확장 할 수 있고 그 질문에 설명 된대로 함수를 호출 할 수 있지만 나는 그렇지 않다.
''call_func' 내부에서'func'를 호출 할 때 예상되는 결과는 무엇입니까? 모든 인수는'id'와 같아야합니까? 귀하의 예'call_func ([] (int & a, char & b) {}, 3)'lambda의 인수는 무엇입니까? –
id 매개 변수는 실제로 중요하지 않습니다. 내 유스 케이스에서는 get_arg 내부에서 사용하여 반환 할 T의 인스턴스를 찾습니다. 람다에 대한 인수는 필자가 위에서 쓴 것과 유사하게 유형 목록의 각 유형에 대해 get_arg를 호출 한 결과가 될 것입니다. 'func (* get_arg (id), * get_arg (id));' –
가능한 중복 일치하는 함수 포인터를 호출하기 위해 튜플을 언 패킹합니다. (http://stackoverflow.com/questions/7858817/unpacking-a-tuple-to-call-a-matching-function-pointer) – TFM