变量模板,具有与实例一样多的参数

Variadic template with as many parameters as are the instances

本文关键字:一样 参数 实例 变量      更新时间:2023-10-16

我想创建一个模板类,该类的参数与程序中调用它的次数一样多。其用途应如下:

template<typename... Ts>
class A
{
std::variant<Ts> v;
};

如果在程序的其余部分,我会实例化

A<int> a;
A<double> b;

然后我想编译器是否可以实例化这样一个类:

class A
{
std::variant<int, double> v;
};

相反,如果在另一个程序中,我会实例化:

A<std::vector<int>> c;
A<std::list<float>> d;
A<char> e;

然后编译器可以实例化:

class A
{
std::variant<std::vector<int>, std::list<float>, char> v;
};

问题的核心是,每次将A与不同类型一起使用时,我都懒得更改它的类型参数。因此,我希望编译器能够统计A的所有用法,并为它们创建一个适当的"并集"。我认为用"概念"是可能的,但同时有可行的解决方案吗?

您想要的是不可能的。单个翻译单元不可能知道整个程序是如何实例化模板的。一个翻译单元中的代码不会意外影响另一个翻译单位中的代码编译。

事实上,由于代码的动态加载,即使是链接的程序也不可能知道整个程序中发生了什么,因为整个程序在编译过程中是不可见的。

只要习惯于保持数据结构与代码同步即可。事实上,是你可以检测到的东西:当你用特定类型实例化A时,你可以检查相应的variant,看看给定的类型是否在该类型列表中。如果不是,则可能会发出编译错误。

或者,重新评估你的设计,这样就不需要这种"全能变体"了。或者,如果any适合您的用例,就使用它。

我认为使用"概念"是可能的

不,不会。