如何检测作为参数传递的函数的参数类型?
How can I detect parameter types of a function passed as a parameter?
问题
我必须编写一个函数,用作:
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.
这是不可能的。例如,如果参数是一个包含模板化(尤其是可变参数)operator()
的函子怎么办?还是超载的?那么"arguments"是什么?
这里的核心问题是您有效地重新实现了范围但更糟。只需在实体上提供普通迭代器,然后使用 std::transform
。或者找到您选择的范围库。
问题
我必须编写一个函数,用作:
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.
这是不可能的。例如,如果参数是一个包含模板化(尤其是可变参数)operator()
的函子怎么办?还是超载的?那么"arguments"是什么?
这里的核心问题是您有效地重新实现了范围但更糟。只需在实体上提供普通迭代器,然后使用 std::transform
。或者找到您选择的范围库。