模板化类型名称的 C++ 模板

C++ template of templated typename

提问人:XORer 提问时间:11/4/2023 更新时间:11/4/2023 访问量:75

问:

我需要使用这样的第三方模板化函数:

template<typename...Types>
void third_party_func(){}

我这样称呼它:

third_party_func<type_1, const type_2>();

我想以某种方式捕捉这种类型。所以我的想法是将其包装到另一个函数中 并借助来捕获该类型。__PRETTY_FUNCTION__

template<typename Funct>
void registerFunct(Funct funct)
{
    // parse __PRETTY_FUNCTION__;
    funct();
}

当我这样称呼它时:

registerFunct(third_party_func<type_1, const type_2>);

__PRETTY_FUNCTION__不捕获 .所以我尝试了别的东西 并希望现在能够捕捉到我想要的东西:type_1, const type_2__PRETTY_FUNCTION__

template<template<typename...FunctParams>typename Funct>
void registerFunct(Funct funct){}

生成错误:缺少模板模板参数的参数列表...

template<template<typename...FunctParams>typename Funct>
void registerFunct(Funct<> funct){}

编译自身,但是当添加实际的函数调用时,不会编译该函数调用...

template<template<typename...FunctParams>typename Funct>
void registerFunct(Funct<FunctParams...> funct){}

生成错误:标识符 FunctParams 未定义...

所以现在我不知道如何正确地做到这一点......

C++ variadic- 函数

评论

1赞 user17732522 11/4/2023
"我想以某种方式捕捉这种类型“:你在这里到底是什么意思?你打算如何处理结果?另外,你在说什么类型?唯一的类型是 和 ,这是您自己提供的。 在 GCC/Clang 中,您提供函数的名称,而不是类型。没有标准化的方法来获取类型或函数的名称。type_1const type_2__PRETTY_FUNCTION__
0赞 user12002570 11/4/2023
“我想以某种方式捕捉这种类型......”这就是您已经通过拥有模板类型参数所做的。所有类型都已经存在。Types
0赞 XORer 11/4/2023
代码将产生输出,因此我可以从那里提取类型,我想用它来制作,因为对我来说是一样的 - 我想在不重复代码的情况下分离只读和读写类型......template<typename... Types> void testFunct() { std::cout << __PRETTY_FUNCTION__ << '\n'; }void testFunct() [with Types = {int, const double}]signature<const type1, type2><type2, const type1>
0赞 user17732522 11/4/2023
"我想用它来签名“:这是什么意思?您无需分析任何类型。调用站点上已具有类型(及其 -qualifier)。即使可以分析类型,也无法将类型名称作为字符串重新定义到类型中。要检查类型是否符合限定条件,您只需要 .检查模板参数是否完全相交为集合也可以仅使用模板代码。我建议您在一个最小的可重现示例中展示您试图避免的代码重复,而不是要求在解决方案中实现有缺陷的尝试。constconststd::is_const_v
1赞 463035818_is_not_an_ai 11/4/2023
怎么了?当您想要始终实例化相同的函数模板时,不需要模板模板参数template <typename ...T> void registerFunc() { /*do whatever you like with T... */ third_party_func<T...>(); }

答: 暂无答案