【发布时间】:2015-06-09 13:08:06
【问题描述】:
我不明白为什么没有optional tuple,我的意思是,像这样的东西; optional<int,string,char> 将结合 optional int、optional string 和 optional char。
你可以把它想象成一个优化的std::tuple<boost::optional<T>...>
optionals 使用的booleans 将全部放在structure 的末尾,以便打包它,或者更好的是,存储在位集中。
这可能会减少结构的内存 A LOT,也更优雅:
std::tuple<boost::optional<int>,boost::optional<string>,boost::optional<char>>
VS
optional<int,string,char>
我可以想到一种方法,使用boost::optional和variadic templates的实现,但在开始之前,我想知道这是否是一个好主意,什么是更好的实现方式这个,我会遇到什么困难?
编辑:
基本上我为什么不喜欢std::tuple<boost::optional<T>...>;
因为optional<T> 是T 和bool 的联合:
新结构可以节省大量内存!!
【问题讨论】:
-
我知道您说的是可选的 boost,但 C++17“词汇”类型仍在设计中。如果你认为 std::optional 可以使用,你应该向 C++ 委员会提交提案
-
另外,也许您可以定义自己的“可选”模板别名以及用于声明和构造可变参数可选的工厂函数。
-
@KABoissonneault 我正在考虑类似的事情,但我不确定
optionallikemove'ing 数据不会有任何问题 -
@AlexandreC。 “可选元组与可选元组不同”,每个人都同意这一点,“你的提议相当于为
std::tuple<optional<Ts>...>编写专业化” 不是专业化,可以作为std::tuple<optional<Ts>...>工作但内存较少 -
@AlexandreC。 :我们已经看到
std::vector<bool>专业化发生了什么。这并不漂亮,尽管位向量非常有用。我真的认为std::tuple<X,Y,Z>应该包含 X、Y 和 Z 类型的成员,即使 X 恰好是optional<int>。
标签: c++ boost tuples variadic-templates optional