【问题标题】:How to create a tuple of N integers in runtime如何在运行时创建 N 个整数的元组
【发布时间】:2014-01-02 05:35:55
【问题描述】:

我需要一种通用的方法来在运行时创建一个包含 N 个整数的元组,其中 N 是向量的大小(不超过 20)。例如:

int main() {
    vector<int> vec;
    vec.push_back(31);
    vec.push_back(24);

    auto x = MakeTuple(vec.size());    // x should have the type tuple<int,int>

    return 0;
}

编辑: 只是为了澄清......我不能坚持使用向量,因为我需要元组类型来使用 lambda 表达式创建 TBB 流图模板类的对象。

编辑 2:显然,我需要解释这个问题。我有非结构化网格,我动态划分为 X 个分区。这些分区中的每一个都与 N 个其他分区相连,其中 N > 1。这些连接定义了我需要用来构建流程图的分区之间的依赖关系。由于网格的结构只有在运行时才知道,所以依赖结构也是如此。因此,我需要一种方法来创建特定的图形节点(TBB 类),这些节点将表示输入依赖关系的元组作为模板参数。

这里是一个如何创建具有两个输入依赖项的 TBB 函数节点的示例:

using namespace tbb:flow;

function_node<tuple<int,int> > *f = 
    new function_node<tuple<int,int>>(g, 1, [=] (tuple<int,int> input) -> void { ... });

join_node<tuple<int,int> *j = new join_node<tuple<int,int>> (g);

make_edge(*j, *f);

现在,假设我们将网格划分为 10 个分区。我们通过检查边列表来确定每个分区的依赖关系。如果有一条边连接两个分区,比如 part1part2,那么这些分区之间存在依赖关系。我使用每个分区向量收集依赖信息。现在问题出现了:我需要使用这个依赖信息(存储在向量中)来创建一个函数节点图,这些函数节点需要基于分区依赖项的正确元组类型。比如part1part2有如下依赖[2,4,5,9]和[1,3],那么我需要这两个函数节点:

function_node<tuple<int,int> > *f1 = 
    new function_node<tuple<int,int>>(g, 1, [=] (tuple<int,int> input) -> void { ... });

function_node<tuple<int,int,int,int> > *f2 = 
    new function_node<tuple<int,int,int,int>>(g, 1, [=] (tuple<int,int,int,int> input) -> void { ... });

【问题讨论】:

  • 无法在运行时选择类型。
  • I need a generic way to create a tuple of N integers in runtime 不,你没有。别再看我们了!
  • (variant) I need a generic way to create a tuple of N integers in runtime 可以,但这段代码不是“通用方式”。
  • C++14? MakeTuple(vec.size(),[&amp;](auto x){ // x is tuple` }`) 怎么样?
  • 这样的元组有多少?

标签: c++ tbb tbb-flow-graph


【解决方案1】:

元组“维度”是它们类型的一部分(通过模板),您不能在运行时从动态选择的值中选择类型。

坚持你的矢量。

【讨论】:

  • 不能吗?错误:这是 C++。几乎肯定不应该?是的。
  • @diggy 你能更好地描述实际问题吗?
  • 好的,我在问题中添加了更多细节。希望这会有所帮助。
  • @Yakk:嗯,没错,你可以想出一个可怕的怪物来实现它为少数几个案例:P 曾经有一个特别突出的例子,但我现在找不到它跨度>
【解决方案2】:

既然它必须是一个元组,而且你确实有长度限制,那么你可以使用工厂方法,比如下面的伪代码

generic_type MakeTuple(size_t n) {
    switch(n) {
        case 1:
            return make_tuple(int);
        case 2:
            return make_tuple(int, int);
        ...
        default:
            throw 'oh crap';
}

【讨论】:

  • 我建议使用相同的方法。但是,您需要将向量作为参数输入并为make_tuple 函数提供正确的参数。
  • 这就是我们的老朋友 boost::make_tuple 出现在 7 中的地方;^) 还是不是?
  • 所以这是我真正能想到的唯一可行的方法,但它肯定不是通用的。我并不是说存在通用方式,但我想知道是否有更优雅的方式来做到这一点。
  • 如果可行,则将其隐藏在界面后面,然后继续处理更紧迫的问题,这些问题在出现更好的解决方案之前无法解决
  • 这并不能解决所提出的问题,因为x 不会携带任何非类型擦除的类型信息。
猜你喜欢
  • 2013-07-08
  • 2015-05-12
  • 2014-02-08
  • 2022-01-11
  • 1970-01-01
  • 2012-06-25
  • 2012-11-30
  • 2020-10-25
  • 2011-07-03
相关资源
最近更新 更多