如何在C ++中使用类型特征获取函数参数的类型?

时间:2014-04-16 14:13:53

标签: c++ templates

我有这个功能:

template <typename F>
void doSomethingWith(F func) {

   T obj = getObjectFromSomewhereElse<T>();
   func(obj);
}

我想从T中推断出F类型,其中TF的第一个(在这种情况下,仅)参数。有没有办法在C ++中执行此操作?

2 个答案:

答案 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;};