我有一个类型列表。我想创建一个元组,其中包含对该列表中每种类型调用函数的结果,并将其用作另一个函子的参数。类似于这样:
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。我有一个类型列表,我想从中生成一个值列表作为函数参数。如果我有值列表,我可以按照那个问题中的方法扩展它们并调用函数,但我没有。
func(*get_arg<int>(id),*get_arg<char>(id));
- Chad Laytonint
、std::list<char>
、double
。如果您不知道要从中生成什么值,那么没有人知道。不清楚您的问题是什么。 - Mike Kinghanfunc(*get_arg<param_types>(id)...)
。它无法编译,因为param_types是一个元组而不是参数包。我的愿望是它会扩展到这个样子:func(*get_arg<int>(id), *get_arg<char>(id));
我会更新我的问题。 - Chad Layton