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

Tar*_*ani 3 c++ templates c++17

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

template<typename... Ts>
class A
{
     std::variant<Ts> v;
};
Run Code Online (Sandbox Code Playgroud)

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

A<int> a;
A<double> b;
Run Code Online (Sandbox Code Playgroud)

然后我想如果编译器可以实例化这种类:

class A
{
     std::variant<int, double> v;
};
Run Code Online (Sandbox Code Playgroud)

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

A<std::vector<int>> c;
A<std::list<float>> d;
A<char> e;
Run Code Online (Sandbox Code Playgroud)

然后编译器可以实例化:

class A
{
     std::variant<std::vector<int>, std::list<float>, char> v;
};
Run Code Online (Sandbox Code Playgroud)

问题的核心是,我懒得在A每次使用不同类型时更改类型参数.所以我想如果编译器可以计算所有用法A并创建它们的适当"联合".我认为"概念"是可能的,但同时有可行的解决方案吗?

Nic*_*las 6

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

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

只是习惯于保持数据结构与代码同步.事实上,这东西,你可以发现:当实例A与特定类型的,可以检查相应的variant,看看如果给定的类型是在类型列表.如果不是,则可以发出编译错误.

或者重新评估您的设计,以便不需要这种"全方位变体".或者只是使用,any如果这适合您的用例.

我认为"概念"是可能的

不,它不会.