如何使用已知的非默认构造函数实例化未知大小的可变参数元组
How do I instantiate a variadic tuple of unknown size with known non-default constructors?
假设我有std::tuple
种类型。我不知道它包含多少或什么类型,但我知道每个元素都有一个接受单个参数的构造函数。
为了解决这个问题,假设参数是整数5
,但该值直到运行时才知道。
如何构造这样的元组?
这是我到目前为止的尝试,它尝试使用编译时常量构造元组(不是我想要的,但它是一个起点):
#include <tuple>
struct Fixture
{
// I don't know the value until runtime, so this is a poor
// example anyway.
template <typename T>
struct Unpack
{
static const int value = 5;
};
template <typename... T>
struct Y
{
Y()
:
// this needs to be a runtime value
tup(Unpack<T>::value...)
{
}
std::tuple<T...> tup;
};
Y<int, double, unsigned /*, some other classes */> y;
};
除了丑陋(Unpack
类不应该是必需的)并且只使用编译时已知的常量值之外,这也会导致链接器错误:
建筑的未定义符号x86_64:
"Fixture::Unpack::value",引用自: Fixture::Y::Y() in testTest.cpp.o ld:找不到架构x86_64符号 叮当:错误:链接器命令失败 使用退出代码 1(使用 -v 查看调用)
标准库或 Boost 中是否有一些元编程魔法可以完成这项工作,最好是使用更简洁的语法?我觉得类似std::integer_sequence
的东西可能会帮助我,但我不知道怎么做!
诀窍是构造一个引用可变参数包的表达式,但其值是你的参数。扩展后,它将成为参数的重复。逗号运算符做得很好:
template <typename... T>
struct Y
{
Y(int value)
: tup((void(sizeof(T)), value)...)
{ }
std::tuple<T...> tup;
};
要void
的强制转换是显式丢弃逗号左侧的值。 sizeof(T)
可以替换为引用T
的任何内容。
删除值上的常量,您可以使用这个
template<typename T>
T Fixture::Unpack<T>::value{};
定义每个可能的"解包类型"。
然后,您可以在运行时使用类似的东西来更新值:
int main() {
std::cin >> Fixture::Unpack<int>::value >> Fixture::Unpack<double>::value;
Fixture f;
std::cout << std::get<0>(f.y.tup) << " " << std::get<1>(f.y.tup);
}
现场示例
相关文章:
- C++:TypeDef使用元组
- Pybind11:将元组列表从Python传递到C++
- 重载元组索引运算符-C++
- 在C++中,如何通过几种类型从元组中选择多个元素
- 将fold表达式与std::一起用于两个元组
- std::ranges::elements_view,用于自定义类似元组的数据
- 将元组的向量转换/构造为堆
- 专用于 std 元组的模板,而无需用户执行remove_cvref
- 将元组的向量构造成堆
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 将元组类型扩展为可变参数模板?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 获取std ::元组元素作为std ::变体
- 将STD ::变体转换为STD ::模板类实例的元组
- 将元组转换为变体
- 为变元元组构造参数堆栈
- 用C++14索引序列可以改进元组变元模板递归吗
- 变分模板和Alexandrescu元组实现
- 可变模板形参和元组迭代
- 通过函数实参而不是模板形参获取元组的元素