变量模板,具有与实例一样多的参数
Variadic template with as many parameters as are the instances
我想创建一个模板类,该类的参数与程序中调用它的次数一样多。其用途应如下:
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
适合您的用例,就使用它。
我认为使用"概念"是可能的
不,不会。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 对象作为参数传递,就好像我们正在传递构造函数值一样
- 变量模板,具有与实例一样多的参数
- C++11: 如何编写一个像 Get 一样工作的模板函数<tuple>...但是收到参数包?
- 将参数传递给成员函数,就像使用 std::cout 一样
- 像在 Python 中一样C++循环中的参数解析。为什么不起作用?
- 可变参数函数并复制粘贴这些参数(就像我们在宏中一样)
- 如何在C++中像函数一样存储参数矩阵
- 我将创建一个简单的命令解释器,允许用户像在任何命令行中一样输入命令,但在 2 个参数后发生错误
- 我可以像删除[3]一样提供参数来删除[]吗?
- C++:像在 Java 中一样将接口作为参数传递
- pthread_create的参数在C++中使用过——每次线程函数得到的值都是一样的,为什么
- c++的NEW对象作为参数(和Java一样)
- 如何生成和函数的密度一样多的参数
- 对于模板类 Foo 方法的参数,"Foo&"和"Foo<T>&"是一样的吗?