假设我有一个具有以下签名的函数:
void foo(std::string const& a, int b, char &c) {
...
}
我怎么能做类似param_type<foo, 3>::type
的事情来得到type == char呢?
背景资料:
我有一组宏/TMP,它生成一个用于将JSON对象转换为C++值的结构体。我还有一组结构体来表示每一种JSON类型(原语、数组、对象等)。主结构体由X宏定义,实现者必须将参数类型(也用作字段类型),json类型(结构体之一)和键名传递到X宏中以定义字段。
我希望能够将字段类型与参数类型分开,这样我就可以将std::optional<TField>
作为结构体的字段类型,并将TField传递给parse方法。这些宏在很多地方都有使用,所以我不想再给X宏添加一个参数。
我尝试使用一个auto
变量,但据我所知,像下面这样的东西是不可能的,这就是为什么我想要param_type
。
auto value;
parse(..., value);
field = value;
4条答案
按热度按时间ohtdti5x1#
你可以创建一个带有部分特化的函数traits:
Demo
brccelvz2#
另一种
std::tuple_element
方式通过函数声明(仅声明,无需定义)所以
param_type
简单地变成观察
pt_helper
声明中的Ind-1u
:你要求param_type
返回带有参数3
的函数的第三个参数类型:通常,在C/C++世界中,索引从零开始计数。我建议你接受param_type<foo, 2>::type
是char
;在这种情况下,您必须删除-1
。也观察
std::remove_reference_t
。因为您希望param_type<foo, 3>::type
是char
(不带引用)而不是char &
(带引用)。无论如何,下面是一个完整的编译示例
bqujaahr3#
在本例中,您可以检查2种类型是否与
std::is_same<T,U>::value
相同查看更多关于is_same
qybjjes14#
有点晚了,但看到我自己的完整(免费)函数traits库here(生产级,完整文档-比Boost版本小得多,也更完整)。将其应用于您的代码(演示here):