C中的std :: pair的等价物

时间:2014-02-27 05:59:16

标签: c++ c std-pair

来自C ++的std::pair的C等价物是多少?我试图在网上找到相同的东西,除了解释它的作用之外什么都找不到。

4 个答案:

答案 0 :(得分:15)

没有一个。 std::pair是一个模板,C与模板没有任何相似之处。

对于模板的给定特化,您可以定义一个或多或少等效的结构;所以std::pair<int, double>类似于

struct pair_int_double {
    int first;
    double second;
};

但如果你想要一个通用模板,你就选择了错误的语言。

答案 1 :(得分:1)

C ++中的

std::pair

templte <class t1, class t2>
struct pair {
  t1 first;
  t2 second;
}

std::pair利用模板,因此每个具体实例都定义了一个新类std::pair<myT1, myT2>

在C中没有这样的东西,你可能每次都要声明一个不同的结构,或者使用void * ...

struct pair {
  struct myT1 first;
  struct myT2 second;
}

答案 2 :(得分:1)

虽然其他答案在说C没有模板时是正确的,但假设您不能拥有通用对类型是错误的。如果你真的需要一个泛型类型,也就是说,你不想为你想要使用它们的每对类型手动定义struct,那么剩下3个选项。

首先,您可以使用包含两个void*类型的结构,并将这些指针用作数据的通用存储指针。 (这是不必要的复杂,我通常不推荐它)

其次,如果预先知道对结构的类型数量,则可以在结构中使用union,例如

struct pair 
{
  union
  {
    int first_int;
    float first_float;
  };
  union
  {
    int second_int;
    float second_float;
  }
}

或者第三,您可以使用参数宏来生成所需类型的结构定义,而无需不断重复自己。

或者,考虑一种编写不依赖模板类型的代码的方法。

答案 3 :(得分:0)

正如其他答案所明确指出的,C 没有任何类似于 C++ 模板的内容。

但是,您可以使用 void* 作为存储任何类型变量地址的方法,方法是将其强制转换为所需数据类型的指针。

在此之后,在 C 中可能实现的对结构如下:

struct pair {
    void* first;
    void* second;
};