是否可以推断出函数参数的类型?例如,如果我有:
void foo(int a);
我想将int
类型推断为foo
第一个参数的类型。可能的用途可能是:
foo( static_cast< decltype(/* ??? foo's first param ??? */) >(value) );
在this related question中,答案利用了具有相同类型的成员进行演绎,因此它不直接推导出函数参数类型。
答案 0 :(得分:12)
是否可以推断出函数参数的类型?
不确定
使用类型特征,例如(argType
)
template <typename>
struct argType;
template <typename R, typename A>
struct argType<R(A)>
{ using type = A; };
void foo(int a)
{ }
int main()
{
long value = 1L;
foo( static_cast<typename argType<decltype(foo)>::type>(value) );
}
如果您对更通用的解决方案感兴趣,下面的示例演示如何创建和使用类型特征来检测返回类型或第n个参数类型
#include <string>
template <std::size_t N, typename T0, typename ... Ts>
struct typeN
{ using type = typename typeN<N-1U, Ts...>::type; };
template <typename T0, typename ... Ts>
struct typeN<0U, T0, Ts...>
{ using type = T0; };
template <std::size_t, typename>
struct argN;
template <std::size_t N, typename R, typename ... As>
struct argN<N, R(As...)>
{ using type = typename typeN<N, As...>::type; };
template <typename>
struct returnType;
template <typename R, typename ... As>
struct returnType<R(As...)>
{ using type = R; };
long bar (int a, std::string const &)
{ return a; }
int main()
{
long valI = 1L;
char const * valS = "abc";
bar( static_cast<typename argN<0U, decltype(bar)>::type>(valI),
static_cast<typename argN<1U, decltype(bar)>::type>(valS) );
static_assert(
std::is_same<long,
typename returnType<decltype(bar)>::type>::value, "!");
}
答案 1 :(得分:4)
the answer by @max66的略微概括版本:
template <typename> struct FirstArgument;
template <typename R, typename A, typename... Args>
struct FirstArgument<R(A, Args...)>
{
using type = A;
};
template <typename T>
using first_agument_t = typename FirstArgument<T>::type;
void foo(int a){ }
void bar(int a, double b){ }
int main()
{
long value = 1L;
foo(static_cast<first_agument_t<decltype(foo)>>(value) );
bar(static_cast<first_agument_t<decltype(bar)>>(value), 0);
}