当前位置 : 主页 > 编程语言 > c++ >

c – 具有与实例一样多的参数的可变参数模板

来源:互联网 收集:自由互联 发布时间:2021-06-23
我想创建一个模板类,它接受的参数与在程序中调用的次数一样多. 其用法应如下: templatetypename... Tsclass A{ std::variantTs v;}; 如果在程序的其余部分我将实例化 Aint a;Adouble b; 然后我想如果
我想创建一个模板类,它接受的参数与在程序中调用的次数一样多.
其用法应如下:

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时,您可以检查相应的变量以查看给定类型是否在该类型列表中.如果不是,则可以发出编译错误.

或者重新评估您的设计,以便不需要这种“全方位变体”.或者只使用任何适合您的用例的任何内容.

I think that it’ll be possible with “concepts”

不,它不会.

网友评论