我必须编写一个将用作的函数:
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。
答案 0 :(得分:1)
这是不可能的。例如,如果参数是包含模板化(尤其是可变参数)operator()
的仿函数,该怎么办?还是一个超载?那么“论点”是什么?
这里的核心问题是你有效地重新实现范围但更糟糕。只需在实体上提供普通迭代器,然后使用std::transform
。或者找到您选择的范围库。