我有这个功能:
template <typename F>
void doSomethingWith(F func) {
T obj = getObjectFromSomewhereElse<T>();
func(obj);
}
我想从T
中推断出F
类型,其中T
是F
的第一个(在这种情况下,仅)参数。有没有办法在C ++中执行此操作?
答案 0 :(得分:1)
对于一个论点,这是一种简单的方法:
template<typename> struct arg;
template<typename R, typename A>
struct arg<R(*)(A)> { using type = A; };
用作(live example)
template<typename T>
T getObjectFromSomewhereElse() { return T{}; }
template <typename F>
void doSomethingWith(F func)
{
using T = typename arg<F>::type;
T obj = getObjectFromSomewhereElse<T>();
func(obj);
}
void f(int x) { std::cout << x << std::endl; }
int main ()
{
doSomethingWith(f); // output 0
}
我们知道func
将衰减为指针,这就是我们为指向函数的指针定义arg
的原因。
这仅适用于功能。对于函数对象(和lambdas),我们需要使用指向成员operator()
的指针,如图所示here(感谢Jarod42)和here(感谢OmnipotentEntity)。
答案 1 :(得分:0)
是的,请看Boost.FunctionTypes。或者,如果您想自己完成,可以通过模板专业化来完成。即为具有参数类型A的函数类型专门化模板,并查看它是什么:
template <class T> class parse_first_arg {};
template <class R, class A> class parse_first_arg<R(A)> {typedef A type;};