如何检测作为参数传递的函数的参数类型?

时间:2015-04-25 11:42:19

标签: c++ function templates lambda variadic-templates

问题

我必须编写一个将用作的函数:

obj.transform([](x& a, y& b) { ... });
obj.transform([](x& a) { ... });
obj.transform([](y const& a, x& b, z const& c) { ... });
obj.transform([a, b](z const& c) { ... });
...

在函数声明中,我需要弄清楚传入的参数的类型。

然后函数的主体处于表单中(假设x是成员对象而传递的函数是argfn):

if (x.mfn1<std::remove_reference_t<Args>...>())
    argfn(x.mfn2<std::remove_reference_t<Args>>()...);

上下文

如果您问自己,为什么并且您不知道这有什么用处,或者您认为这是一个XY问题,那么您可以找到the context right here

我的尝试

尝试#1

template<typename... Args>
void fn(std::function<void(Args...)>) { ... }

doesn't work因为显然无法在std::function和任何lambda之间进行转换。

尝试#2

template<typename... Args>
void fn(void(*)(Args...)) { ... }

这适用于上面的第一个,第二个和第三个例子(在每个lambda上添加+以强制转换为指向函数的指针),但是fails on the fourth

1 个答案:

答案 0 :(得分:1)

这是不可能的。例如,如果参数是包含模板化(尤其是可变参数)operator()的仿函数,该怎么办?还是一个超载?那么“论点”是什么?

这里的核心问题是你有效地重新实现范围但更糟糕。只需在实体上提供普通迭代器,然后使用std::transform。或者找到您选择的范围库。