我想创建一个模板类,它接受与在程序中被调用的次数一样多的参数。 其用法应如下:
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
的所有用法并为其创建一个适当的“联合”。
我认为“概念”是可能的,但是与此同时有可行的解决方案吗?
答案 0 :(得分:6)
您想要的东西是不可能的。单个翻译单元可能无法知道整个程序如何实例化模板。一个翻译单元中的代码不会偶然影响另一翻译单元中代码的编译。
实际上,由于动态加载代码,即使是链接程序也无法知道整个程序中发生了什么,因为整个程序对于编译过程是不可见的。
只需习惯使该数据结构与您的代码保持同步即可。确实,您可以检测到 :在使用特定类型实例化A
时,您可以检查相应的variant
以查看给定类型是否在该类型列表中。如果不是,则可以发出编译错误。
或者重新评估您的设计,这样就不需要这种“全变”了。或者,如果适合您的用例,只需使用any
。
我认为“概念”将成为可能
不,不会。