<分区>
我有这个功能:
template <typename F>
void doSomethingWith(F func) {
T obj = getObjectFromSomewhereElse<T>();
func(obj);
}
我想推导出类型 T
来自 F
, 其中T
是 F
的第一个(在本例中是唯一的)参数.有没有办法在 C++ 中执行此操作?
<分区>
我有这个功能:
template <typename F>
void doSomethingWith(F func) {
T obj = getObjectFromSomewhereElse<T>();
func(obj);
}
我想推导出类型 T
来自 F
, 其中T
是 F
的第一个(在本例中是唯一的)参数.有没有办法在 C++ 中执行此操作?
最佳答案
对于一个参数,这是一种简单的方法:
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
的原因。
这只适用于函数。对于函数对象(和 lambda),我们需要使用指向成员 operator()
的指针,如 here 所示。 (感谢 Jarod42)和 here (感谢 OmnipotentEntity)。
关于c++ - 如何使用 C++ 中的类型特征获取函数参数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23112016/