35

我想使用与 std::pair 尽可能相似的三元组类。STL 似乎没有。我不想使用太重的东西,比如Boost。是否有一些有用的 FOSS 非限制性许可三元组我可以从某个地方提升?我应该自己滚动吗?我应该完全做其他事情吗?

编辑:关于std::tuple...

三胞胎特定的课程真的没有好处吗?我的意思是,对于元组,我做不到

template<typename T1, typename T2, typename T3> std::tuple<T1, T2, T3> triple;

现在可以吗?我不需要 typedef 个人类型组合三元组吗?

4

5 回答 5

48

不,不要自己动手。相反,看看std::tuple- 它是std::pair. 所以这是一个值初始化的ints 三元组:

std::tuple<int, int, int> triple;

如果你愿意,你可以只为三元组设置一个类型别名:

template<typename T1, typename T2, typename T3>
using triple = std::tuple<T1, T2, T3>;
于 2013-12-20T14:24:23.277 回答
7

如果可以使用 C++11,请使用 std::tuple

如果没有,请使用 boost::tuple

于 2013-12-20T14:24:55.013 回答
6

如果您使用的是 C++11,则可以使用std::tuple.

如果您使用的是 C++03,那么您要么需要自己滚动(这不太难),要么使用tupleBoost。

于 2013-12-20T14:25:53.617 回答
3

我认为你需要这样的东西:

template<typename T>
struct triplet
{
    T first, middle, last;
};

template<typename T>
triplet<T> make_triplet(const T &m1, const T &m2, const T &m3) 
{
    triplet<T> ans;
    ans.first = m1;
    ans.middle = m2;
    ans.last = m3;
    return ans;
}

使用示例:

triplet<double> aaa;
aaa = make_triplet<double>(1.,2.,3.);
cout << aaa.first << " " << aaa.middle << " "  << aaa.last << endl;

triplet<bool> bbb = make_triplet<bool>(false,true,false);
cout << bbb.first << " " << bbb.middle << " "  << bbb.last << endl;

我正在使用它,这足以满足我的目的......但是,如果您想要不同的类型,只需进行一些修改:

template<typename T1, typename T2, typename T3>
struct triplet
{
    T1 first; 
    T2 middle;
    T3 last;
};

template<typename T1, typename T2, typename T3>
triplet<T1,T2,T3> make_triplet(const T1 &m1, const T2 &m2, const T3 &m3) 
{
    triplet<T1,T2,T3> ans;
    ans.first = m1;
    ans.middle = m2;
    ans.last = m3;
    return ans;
}

用法将非常相似:

triplet<bool,string,myDouble> ccc;
ccc = make_triplet<bool,string,double>(false,"AB",3.1415);
ccc.middle = "PI";
cout << ccc.first << " " << ccc.middle << " "  << ccc.last << endl;
于 2014-12-11T00:37:01.630 回答
-1

要向 std::pair 添加相似性方面,您可以定义一个具有第一、第二和第三的类。我的猜测是,在这种情况下,您无法避免创建 std::pair 的子类并添加“第三个”成员。这是几行代码。

此外,如果您经常将这些东西与同一类型一起使用,您也可以制作双胞胎和三胞胎课程。使用 C++-11 的“使用”轻松制作,例如:

template <typename T> using twins = std::pair<T,T>;
于 2017-06-13T07:52:53.547 回答