【发布时间】:2022-01-20 13:51:56
【问题描述】:
给定一个类的形式:
template <int A, int B, int C>
struct Functor {
static int go() {
return A*B*C;
}
};
我需要为 Functor 生成参数的类型的参数包/元组/等。也就是说,我希望能够执行以下操作:
// Imagining that I have many Functor classes...
using FirstArgType = TypeAt<Functor, 1>::T;
FirstArgType t {4};
本质上,我需要从值的参数包转到 unspecialized 模板类的这些值的类型的参数包 - 即 Functor 而不是 Functor<1, 2, 3> .我天真地从看起来像这样的事情开始:
template <template <auto...Values> typename Class>
struct ClassInfo {
using Tuple = std::tuple<decltype(Values)...>;
};
但是,嵌套的模板-模板参数不能像这样访问 (error: use of undeclared identifier 'Values')。请注意,当我使用 auto...Values 作为顶级模板参数时,这种元组技术可以很好地发现类型 - 问题在于提取 Class 的模板参数。
对于我尝试过的每个公式,我需要在某些时候指定一个完全专业化的类型(例如Functor<1, 2, 3>)以找出类型 - 但我正在尝试操作模板类 Functor,而不是它的特化 Functor<n,n,n> - 我需要模板代码来操作 每个 特化,例如Functor<1, 2, 3> 和 Functor<4, 5, 6>,不只是查找特定专业的类型。
一方面:我觉得我在尝试用 C++ 模板做一些根本不可能的事情——以我不理解的方式——这就是为什么我能想到的每个公式都失败了。
另一方面:很明显Functor 的模板参数类型在编译时是众所周知的,所以我想应该有办法发现这些。
解决方案会很棒,但我同样很高兴听到有关处理我不熟悉的模板-模板参数的策略/技术/设计模式(我不认为自己在这里是专业人士)。
【问题讨论】:
-
对于上下文:我正在使用来自美妙的 Petra 库 (github.com/jacquelinekay/petra) 的技术来构造切换表,以将运行时值映射到不同的编译时特化函数。因此,务实的目标是使用运行时值调用 functor,例如mapped_functor(1, 2, 3)
标签: c++ templates metaprogramming