gpt4 book ai didi

c++ - 函数参数的decltype

转载 作者:IT老高 更新时间:2023-10-28 22:04:20 25 4
gpt4 key购买 nike

是否可以推断出函数参数的类型?例如,如果我有:

void foo(int a);

我想推导出int类型作为foo的第一个参数的类型。可能的用途是:

foo( static_cast< decltype(/* ??? foo's first param ??? */) >(value) );

this related question ,答案是利用同类型成员进行推导,所以不直接推导函数参数类型。

最佳答案

Is it possible to deduce the type of a function parameter?

当然。

具有类型特征,例如 (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, "!");
}

关于c++ - 函数参数的decltype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43526647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com