可变参数模板,其参数与实例一样多

时间:2018-07-22 13:21:24

标签: c++ templates c++17

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

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的所有用法并为其创建一个适当的“联合”。 我认为“概念”是可能的,但是与此同时有可行的解决方案吗?

1 个答案:

答案 0 :(得分:6)

您想要的东西是不可能的。单个翻译单元可能无法知道整个程序如何实例化模板。一个翻译单元中的代码不会偶然影响另一翻译单元中代码的编译。

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

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

或者重新评估您的设计,这样就不需要这种“全变”了。或者,如果适合您的用例,只需使用any

  

我认为“概念”将成为可能

不,不会。