gpt4 book ai didi

c++ - 获取 C++ 函数参数的类型

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

有没有一种标准的方法来获取函数参数的类型并将这些类型作为模板参数包传递?我知道这在 C++ 中是可能的,因为 it has been done before .

我希望在 C++14 或即将推出的 C++1z 中,有一种惯用的方式来实现 arg_types<F>...这里:

template <typename ...Params>
void some_function(); // Params = const char* and const char*

FILE* fopen(const char* restrict filename, const char* restrict mode);

int main(){
some_function<arg_types<fopen>...>();
}

为了清楚起见,声称没有标准方法可以做到这一点的答案不是答案。如果没有答案,我希望这个问题一直没有答案,直到解决方案添加到 C++500 或直到宇宙热寂,以较早发生的为准:)

编辑:已删除的答案指出我可以使用 PRETTY_FUNCTION获取参数类型的名称。但是,我想要实际的类型。不是这些类型的名称。

最佳答案

此语法略有不同。

首先,因为类型比 packs 更容易使用,packs 是一种包含包的类型。 using type=types;只是节省了我在生成 types 的代码中的工作:

template<class...>struct types{using type=types;};

这是主力。它需要一个签名,并产生一个 types<?...>包含签名参数的包。 3 个步骤,我们就可以得到干净整洁的 C++14esque 语法:

template<class Sig> struct args;
template<class R, class...Args>
struct args<R(Args...)>:types<Args...>{};
template<class Sig> using args_t=typename args<Sig>::type;

这是一个语法差异。而不是直接取Params... ,我们采取types<Params...> .这类似于“标签调度”模式,我们利用模板函数类型推导将参数移动到类型列表中:

template <class...Params>
void some_function(types<Params...>) {
}

我的fopen不同,因为我不想打扰 #include东西:

void* fopen(const char* filename, const char* mode);

而且语法不是基于 fopen ,而是fopen类型 .如果你有一个指针,你需要做 decltype(*func_ptr)或类似的。或者我们可以增加顶部来处理 R(*)(Args...)为了方便使用:

template<class Sig>
struct args<Sig*>:args<Sig>{}; // R(*)(Args...) case
template<class Sig>
struct args<Sig&>:args<Sig>{}; // R(&)(Args...) case

然后测试代码:

int main(){
some_function(args_t<decltype(fopen)>{});
}

live example .

请注意,这不适用于重载函数,也不适用于函数对象。

一般来说,这种事情是个坏主意,因为通常你知道你是如何与一个对象交互的。

仅当您想获取一个函数(或函数指针)并从某个堆栈中弹出一些参数并根据预期的参数或类似的参数调用它时,上述内容才有用。

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

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