【发布时间】:2016-06-22 15:35:48
【问题描述】:
我有两个元组,每个元组都包含不同类型的容器。
std::tuple<containerA<typesA>...> tupleA;
std::tuple<containerB<typesB>...> tupleB;
所以,作为一个例子,tupleA 可以这样定义:
std::tuple<list<int>, list<float>> tupleA;
containerA 和 containerB 这两个容器是不同的类型。 typesA 和 typesB 不相交。我想按大小对元组内的容器进行排序,并能够按它们的类型访问它们。所以,举个例子
std::tuple<list<int>, list<float>> tupleA {{2}, {3.3f, 4.2f}};
std::tuple<deque<double>, deque<uint8_t>> tupleB {{2.0, 1.2, 4.4}, {}};
auto sortedArray = sort(tupleA, tupleB);
sortedArray == {deque<uint8_t>, list<int>, list<float>, deque<double>};
sortedArray.get<list<float>>() == {3.3f, 4.2f};
std::get<list<int>>(tupleA).push_back(4);
std::get<list<int>>(tupleA).push_back(5);
std::get<list<int>>(tupleA).push_back(6);
sortedArray = sort(tupleA, tupleB);
sortedArray == {deque<uint8_t>, list<float>, deque<double>, list<int>};
最重要的部分是我必须存储sortedArray 并且元组中元素的大小可能会改变。我无法创建这样的sort 函数。访问sortedArray 的实际语法并不重要。
我尝试对sortedArray中的容器数据使用朴素索引,例如使用std::pair<A, 1>来引用元组A中的第二个元素,但是我无法通过它访问元组的信息,因为它不是 constexpr
【问题讨论】:
-
@ArchbishopOfBanterbury 你不能
std::sort一个元组,因为它们的顺序是不可变的。这样做会创建一个新类型。 -
您说“我想按大小对元组中的容器进行排序。” “尺寸”是什么意思?它们包含的元素数量?如果是这样,那就是运行时信息,
tuple中的类型排序是类型信息,因此在编译时需要。 -
@JonathanMee 是的,根据它们包含的元素数量。我不是指实际
tuples 的排序,我指的是我创建的sortedArray的排序。这个sortedArray可以是vector或您需要的任何类型。 -
我很好奇你是如何达到这个要求的。
-
@LightnessRacesinOrbit 我同意。毫无疑问,有人会建议使用
void*或其他一些规避语言规则的方法来处理这个问题。但是这个问题与语言本身作斗争。最好的解决方案是利用模板的力量和使用语言的力量。但要找到这样的解决方案,需要更多关于需求动机的信息。